MySQL aime plusieurs valeurs

144

J'ai cette requête MySQL.

J'ai des champs de base de données avec ce contenu

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

Pourquoi cette requête similaire ne fonctionne-t-elle pas? J'ai besoin des terrains avec sports ou pub ou les deux?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%')
webmasters
la source

Réponses:

133

La (a,b,c)liste ne fonctionne qu'avec in. Pour like, vous devez utiliser or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
Andomar
la source
3
Cela ne serait pas bénéfique dans plusieurs requêtes (disons 5 requêtes de recherche dynamiques ou plus), il serait donc préférable d'utiliser une expression régulière.
Shayan Ahmad
315

Façon plus rapide de faire cela:

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

est-ce:

WHERE interests REGEXP 'sports|pub'

Vous avez trouvé cette solution ici: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

En savoir plus sur REGEXP ici: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

jazkat
la source
si vous passez un nombre inconnu de mots-clés sous forme de chaîne (a | b | c ...), l'expression rationnelle est la seule solution si vous voulez faire LIKE, n'est-ce pas?
fréquent le
1
Savez-vous si cela peut être fait avec une sous-requête? Disons que j'ai une colonne de mots à rechercher, comment puis-je remplacer «sports | pub» par une sous-requête?
AdamMc331
Hé, pourriez-vous me dire le REGEXP pour LIKE au lieu de% LIKE%, j'essaie de récupérer des chaînes exactes ...
Deepanshu Goyal
3
Cette solution souffle le premier hors de l'eau
Donato
2
Pour obtenir la valeur de l'expression rationnelle à partir d'une colonne:(select group_concat(myColumn separator '|') from..)
daVe
34

Pourquoi ne pas essayer REGEXP. Essayez-le comme ceci:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'
Ahmad Hussain
la source
5
Ouais!! Je veux que ce soit le contraire. Donc c'est SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Pathros
3
En quoi cette réponse est-elle différente de la jazkatréponse soumise 5 ans avant la vôtre?
Vaidas le
@Vaidas - merci - me posait la même question ...: D
theFriedC
18

Vous pouvez également utiliser RLIKE.

Par exemple:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
iamharish15
la source
6
Notez juste pour tout le monde que RLIKE et REGEXP sont synonymes
Intacto
8

Votre requête doit être SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Ce que je comprends, c'est que vous stockez les intérêts dans un champ de votre table, ce qui est une idée fausse. Vous devriez définitivement avoir une table «intérêts».

Alexis Dufrenoy
la source
2
Je pense que cela devrait l'être SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), mais cette technique est susceptible de surpasser les regex dans la plupart des situations.
Chris Strickland le
7

N'oubliez pas d'utiliser des parenthèses si vous utilisez cette fonction après un ANDparamètre

Comme ça:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%')
Luan
la source
3

Ou si vous ne devez faire correspondre que le début des mots:

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

vous pouvez utiliser les correspondances de caret d'expression régulière:

WHERE interests REGEXP '^sports|^pub'

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

vadim
la source
2

Comme @Alexis Dufrenoy l'a proposé, la requête pourrait être:

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

Plus d'informations dans le manuel .

Franc Drobnič
la source
1

Plus d'exemples de travail:

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

La tâche consistait à compter les participants à un ou plusieurs événements avec filtre si l'extension d'e-mail était égale à plusieurs domaines d'entreprise.

Intacto
la source