2010-11-13 9 views
99

J'ai cette requête MySQL.MySQL Comme plusieurs valeurs

Je 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 cela comme requête ne fonctionne pas? J'ai besoin des champs avec sport ou pub ou les deux?

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

Répondre

89

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

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

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

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

+2

Je pense qu'il devrait être 'SELECT * FROM table WHERE find_in_set (intérêts, 'sports, pub')', mais cette technique est susceptible de surpasser regex dans la plupart des situations. –

+0

Vous avez raison. J'ai édité ma réponse. –

234

plus rapide façon de le faire:

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

est la suivante:

WHERE interests REGEXP 'sports|pub' 

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

+28

+1, mais pas plus rapide en exécution, mais plus rapide en touches. – Johan

+0

Si vous passez une quantité inconnue de mots-clés sous la forme d'une chaîne (a | b | c ...), l'expression rationnelle est la seule façon de procéder si vous voulez faire LIKE, n'est-ce pas? – frequent

+0

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

3

Don pas oublier d'utiliser des parenthèses si vous utilisez cette fonction après un paramètre AND

Comme ceci:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%') 
25

Pourquoi ne pas vous essayez REGEXP. Essayez comme ceci:

SELECT * FROM table WHERE interests REGEXP 'sports|pub' 
+1

c'est vraiment sympa. appris quelque chose de nouveau. merci ,, – amrodelas

+0

Cela devrait être la réponse acceptée. – Mark

+0

Merci Marc mais ils ont déjà accepté une autre réponse :) –

1

Comme @Alexis Dufrenoy 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 manual.