Несколько как в SQL - PullRequest
       32

Несколько как в SQL

3 голосов
/ 31 мая 2010

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

Таблица в 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

Ответы [ 2 ]

7 голосов
/ 31 мая 2010

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

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

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.

6 голосов
/ 31 мая 2010

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

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

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

...