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

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

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


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'

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'

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».


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


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 .


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.