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 чи більше динамічних запитів пошуку), тому краще було б використовувати regexp.
Шаян Ахмад

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%, я намагаюся отримати точні рядки ...
Deepanshu Goyal

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.