MySQL - ГДЕ x IN (столбец)

0

Я что-то пробовал. Вот простой пример в SQL Fiddle: Example

Существует столбец someNumbers (номера, разделенные запятыми), и я попытался получить все строки, в которых этот столбец содержит определенный номер. Проблема в том, что результат содержит только строки, где someNumbers начинается с определенного числа.

Запрос SELECT * FROM myTable where 2 in ( someNumbers ) возвращает только строку с id 2, а не строку с id 1.

Какие-либо предложения? Спасибо вам всем.

  • 0
    Отредактируйте свой вопрос и предоставьте образцы данных и желаемых результатов в вопросе в табличном формате . У вас достаточно репутации, чтобы вы знали, как это сделать.
  • 0
    Есть пример SQL Fiddle, но я обновляю вопрос.
Показать ещё 4 комментария
Теги:

4 ответа

4
Лучший ответ

Вы храните данные в неправильном формате! Вы не должны хранить несколько значений в одном столбце строки. Вы не должны хранить числа как строки. Вместо этого, вы должны иметь таблицу перехода с одной строкой на id и за number.

Иногда у вас просто нет выбора, потому что кто-то создал действительно плохо разработанную базу данных. В этих ситуациях MySQL имеет функцию find_in_set():

SELECT *
FROM myTable 
WHERE find_in_set(2, someNumbers ) > 0;

Однако правильным решением является исправление модели данных.

  • 0
    Потрясающие. Спасибо! Как вы уже упоминали, иногда вы имеете дело с наследством.
4

В то время как Гордон ответ хороший, вот способ сделать это с like

SELECT * FROM myTable where someNumbers like '2,%' or someNumbers like '%,2,%' or someNumbers like '%,2'

Первый, like проверяет, начинает ли ваш массив номер, который вы ищете (2). Второй проверяет, находится ли 2 в массиве и последние, like тесты для внешнего вида в конце.

Обратите внимание, что запятые здесь важны, потому что что-то вроде '%2%' также будет соответствовать ...,123,...

EDIT: Как было предложено OP, может случиться, что в строке присутствует только одно значение. Следовательно, запрос должен проверить этот случай, выполнив ... someNumbers = '2'

  • 1
    не забудьте о возможном случае, когда в столбце хранится только один номер .... И someNumbers = '2'
  • 1
    Это хороший пример работы с устаревшими вещами. Просто упомяну: хотя это будет работать, это будет крайне неэффективно, так как для такого запроса индекс не будет использоваться. Если вы строите какую-то функцию на уровне производства, вам следует подумать о нормализации структуры.
0
Select * from table_name where coloumn_name IN(value,value,value)

вы можете использовать его

  • 0
    Правильный запрос, но часть (значение, значение, значение) является значением столбца. Это проблема.
  • 0
    Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и почему он решает проблему, улучшит долгосрочную ценность ответа.
0

Я бы предложил этот запрос:

    SELECT * FROM myTable where someNumbers like '%2%'

Он будет выбирать каждую запись, в которой someNumbers содержит "2",

  • 1
    Да, но он также возвращает строки с, например, 22. Так что это должно быть что-то вроде: WHERE someNumbers = '2' или someNumbers LIKE '2,%' или someNumbers вроде '%, 2' или someNumbers LIKE '%, 2,%' .... это не очень элегантно ;-)
  • 0
    Да, это было просто, чтобы дать вам идею, но есть несколько других случаев, чтобы рассмотреть на самом деле.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню