MySQL как несколько значений

144

У меня есть этот запрос MySQL.

У меня есть поля базы данных с этим содержимым

sports,shopping,pool,pc,games 
shopping,pool,pc,games 
sports,pub,swimming, pool, pc, games   

Почему этот запрос не работает? Мне нужны поля со спортом или пабом или с обоими?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%')
веб-мастера
источник

Ответы:

133

(a,b,c)Список работает только с in. Для like, вы должны использовать or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
Andomar
источник
3
Это было бы не выгодно для множественных (скажем, 5 или более динамически поисковых запросов), поэтому было бы лучше использовать регулярное выражение.
Шаян Ахмад
315

Более быстрый способ сделать это:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'

это:

WHERE interests REGEXP 'sports|pub'

Нашел это решение здесь: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

Подробнее о REGEXP здесь: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

jazkat
источник
если вы передаете неизвестное количество ключевых слов в виде строки (a | b | c ...), регулярное выражение является единственным способом, если вы хотите сделать LIKE, не так ли?
частые
1
Вы знаете, можно ли это сделать с помощью подзапроса? Допустим, у меня есть столбец слов, который мне нужно найти, как я могу заменить «sports | pub» подзапросом?
AdamMc331
Эй, не могли бы вы сказать мне REGEXP для LIKE вместо% LIKE%, я пытаюсь получить точные строки ...
Дипаншу Гоял
3
Это решение выдувает первый из воды
Донато
2
Чтобы получить значение регулярного выражения из столбца:(select group_concat(myColumn separator '|') from..)
daVe
34

Почему бы вам не попробовать REGEXP. Попробуйте это так:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'
Ахмад Хуссейн
источник
5
Да!! Я хочу это наоборот. Так и есть SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Патрос
3
Чем этот ответ отличается от jazkatответа, представленного за 5 лет до вашего?
Вайдас
@Vaidas - спасибо - задавал себе тот же вопрос ...: D
theFriedC
18

Вы также можете использовать RLIKE.

Например:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
iamharish15
источник
6
Просто отметьте для всех, что RLIKE и REGEXP являются синонимами
Intacto
8

Ваш запрос должен быть SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Что я понимаю, так это то, что вы храните интересы в одной области таблицы, что является заблуждением. У вас обязательно должна быть таблица «процентов».

Алексис Дафреной
источник
2
Я думаю, что так и должно быть SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), но этот метод, вероятно, превзойдет регулярное выражение в большинстве ситуаций.
Крис Стрикленд,
7

Не забудьте использовать скобки, если вы используете эту функцию после ANDпараметра

Как это:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%')
Луан
источник
3

Или, если вам нужно сопоставить только начало слов:

WHERE interests LIKE 'sports%' OR interests LIKE 'pub%'

Вы можете использовать регулярные выражения:

WHERE interests REGEXP '^sports|^pub'

https://www.regular-expressions.info/anchors.html

вадим
источник
2

Как предложил @Alexis Dufrenoy, запрос может быть следующим:

SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

Более подробная информация в руководстве .

Франк Дробнич
источник
1

Больше примеров работы:

SELECT COUNT(email) as count FROM table1 t1 
JOIN (
      SELECT company_domains as emailext FROM table2 WHERE company = 'DELL'
     ) t2 
ON t1.email LIKE CONCAT('%', emailext) WHERE t1.event='PC Global Conference";

Задача состояла в том, чтобы подсчитать участников в событии (ях) с фильтром, если расширение электронной почты равно нескольким доменам компании.

Intacto
источник