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%'

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


если вы передаете неизвестное количество ключевых слов в виде строки (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'

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%')



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";

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.