2010-05-30 2 views
3

Я хотел выполнить поиск по нескольким строкам и получить строку, содержащую определенный элемент.Несколько LIKE в SQL

Таблица в mySQL настроена так, что каждый идентификатор имеет уникальный список (с разделителями-запятыми) значений для каждой строки.

Ex:

id | order 
1 | 1,3,8,19,34,2,38 
2 | 4,7,2,190,38 

Теперь, если я хочу, чтобы вытащить строку, которая содержала только номер 19, как бы я идти об этом? Возможности я мог бы фигурировать в списке с LIKE условие будет:

19,  <-- 19 at the start of the list 
,19  <-- 19 at the end of the list 
,19, <-- 19 inside the list 

Я попытался следующие, и я не могу получить какие-либо результаты, Спасибо за вашу помощь!

SELECT * 
FROM categories 
WHERE order LIKE '19,%' OR '%,19%' OR '%,19%' 
LIMIT 0 , 30 
+0

Обратите внимание, что фраза «строка, содержащая только номер 19», может пониматься как означающая только строки, которые имеют только значение 19 в поле порядка, и в этом случае ни одна из ваших двух примерных строк не будет соответствовать. Я понял это, исходя из остальной части вашего текста, чтобы означать «строка, которая содержит номер 19, а не любое число, которое содержит 19 как часть его, например 190». Надеюсь, это правильно, иначе, пожалуйста, исправьте свой вопрос. –

+0

Эй, спасибо за ваше предложение, я буду использовать дочерний стол в будущем. – ninu

ответ

6

Вы можете использовать FIND_IN_SET решить вашу проблему более простым способом:

SELECT * 
FROM categories 
WHERE FIND_IN_SET('19', `order`) 
LIMIT 0, 30 

В общем, хотя вы должны попытаться спроектировать базу данных, так что этот тип операции не требуется.

7

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

Сказав это, что вы хотите, это:

WHERE ',' + order + ',' LIKE '%,19,%' 

Добавляя запятую перед и после того, как список значений в order поле, вы можете запросить, что поле для значения, которое с запятая с каждой стороны и не иметь дело со специальным случаем, когда значение является первым или последним значением в списке.

С запросом вы перечислили, вы могли бы сделали свою работу, понимая, что OR не дает больше аргументов в п LIKE, она отделяет совершенно разные положения, и, таким образом, переписать SQL так:

WHERE order LIKE '19,%' OR order LIKE '%,19,%' OR order LIKE '%,19' 
          ---+------ ^ ----+-----  ^
           |   |   |   | 
           +- add this -+---------+   +- removed 
                    percent 

Примечание недостающее запятой во втором образце, там, которые будут соответствовать строки, содержащие значение 19, и обратите внимание на удаленный процент символ в последней, которая позволила бы ему соответствовать списки, которые завершились 19