#mysql
#mysql
Вопрос:
У меня есть небольшая проблема. Я очень новичок в MYSQL и хочу проверить, есть ли конкретная цифра/число в другом номере. Небольшой пример:
(В этом примере он должен выбрать все из таблицы 1, у которого есть число, содержащееся в значении таблицы 2)
Таблица 1:
id value 1 3 2 4 3 1 4 2
Таблица 2:
id2 values 1 13
Результат:
Таблица 1
id value 1 3 3 1
(Потому что идентификаторы 1 и 3 имеют значение 3 и 1, которое содержится в числе 13)
Я надеюсь, что кто — нибудь сможет мне помочь. Это также было бы возможно, если бы существовал другой формат для 13, например «1,3», если это было бы проще. Прошу прощения за мой плохой английский. Я говорю по-немецки от рождения.
Комментарии:
1. Если символ
'13'
представляет собой a'1'
и a'3'
, но не числовое значение13
, то хранить их в одном значении неправильно, даже хранить их в виде строк, разделенных запятыми, неправильно; всегда храните дискретные значения отдельно, а не объединять в строки.1
И3
должно быть либо в разных строках, либо в разных столбцах. Тогда SQL становится тривиальным; потому что тогда вы используете SQL так, как он разработан.2. Я тоже так думал. Но проблема, с которой я столкнулся, заключается в том, что значение 13 зависит от пользователя. Затем я бы создал несколько строк с одним и тем же идентификатором пользователя или создал бесконечные столбцы. Поэтому его нужно хранить именно так. Неужели нет никакой возможности это сделать?
3. итак, если кто-то введет в таблицу 2 значение
1234
, вы хотите выбрать все строки из таблицы 1?4. ДА. Вот чего я хочу. И если я введу 14, он должен отображать только идентификаторы 2 и 3
5. @silvinator Нет проблем с использованием нескольких строк так, как вы описываете. На самом деле, это стандартная практика в таблицах ссылок; все, что связывает одну сущность (пользователя) с несколькими сущностями (вашим значением), обычно делается таким образом. Существуют анти-шаблоны, которые делают это так, как вы предпочитаете, но они влекут за собой штрафы за производительность и техническое обслуживание, поэтому я лично отказываюсь обучать таким плохим практикам. (Перестаньте бороться с нормализованной структурой, присущей SQL, изучите ее, примите и поймите. Вера в то, что вы знаете лучше, приведет только к боли и трудностям.)
Ответ №1:
Я не согласен с тем, как вы храните данные, но сейчас вы можете выбрать данные следующим образом:
SELECT * FROM table1 WHERE EXISTS ( SELECT * FROM table2 WHERE table2.values LIKE CONCAT('%', table1.value, '%') )
Как только вы нормализуете свою таблицу2, т. е. сохраните (13)
в виде двух строк (1), (3)
, можно будет использовать один и тот же запрос:
SELECT * FROM table1 WHERE EXISTS ( SELECT * FROM table2 WHERE table2.value = table1.value )
Комментарии:
1. Это должно содержать предупреждения о том, почему это плохо. Например, влияние на производительность из-за невозможности использовать индексы.