78 votes

MySQL SELECT LIKE ou REGEXP pour faire correspondre plusieurs mots dans un enregistrement

Le champ table . name contient 'Stylus Photo 2100' et avec la requête suivante

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'

Je n'obtiens aucun résultat. Bien sûr, je le ferais si je cherchais

SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'

Comment puis-je sélectionner l'enregistrement en recherchant 'Stylus 2100' ?

Merci

0 votes

Caveat : Cette question porte sur deux mots apparaissant dans un ordre particulier. La plupart des réponses ne permettent pas d'associer "2100 Stylus".

123voto

SERPRO Points 5825

Eh bien, si vous connaissez l'ordre de vos mots vous pouvez utiliser :

SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'

Vous pouvez également utiliser :

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'

0 votes

Merci, comme ça je n'aurai pas 'HP Laserjet 2100'. Désolé si mon exemple n'était pas le meilleur.

1 votes

L'un des auteurs de la réponse ici a comparé les performances de LIKE / REGEX et a trouvé que LIKE était plus performant, pour info : stackoverflow.com/questions/1127088/mysql-like-in

0 votes

@Amalgovinus merci pour le lien, je n'y aurais pas pensé . C'est bon à savoir :)

29voto

Ondrej Bozek Points 1988

Je pense que la meilleure solution serait d'utiliser les expressions régulières. C'est la plus propre et probablement la plus efficace. Les expressions régulières sont prises en charge par tous les moteurs de BD couramment utilisés.

Dans MySql, il y a RLIKE donc votre requête serait quelque chose comme :
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
Je ne suis pas très fort en regexp donc j'espère que l'expression est correcte.

Editar
Le RegExp devrait plutôt être :

SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'

Plus d'informations sur le support regexp de MySql :
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

18voto

Melvin Protacio Points 641

Vous pouvez simplement remplacer chaque espace par %

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'

0 votes

Merci, mais de cette façon, je n'obtiendrais pas si je cherchais "Photo Stylus 2100".

1 votes

Haha ! ok, cette exigence n'était pas spécifiée dans la question, "Comment puis-je sélectionner l'enregistrement en recherchant 'Stylus 2100' ?"

0 votes

Je sais que cette question est ancienne, mais n'est-ce pas la solution la plus efficace ? D'après ce que je peux dire, cela correspondra Photo Stylus 2100 . Il correspondra anything suivi par Stylus suivi par anything suivi par 2100 suivi par anything . Si quelqu'un n'est pas d'accord, veuillez me dire pourquoi, car cela signifie que j'ai fondamentalement mal compris quelque chose à propos des expressions similaires.

8voto

Martin Points 51

La solution correcte est une recherche FullText (si vous pouvez l'utiliser). https://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

Cela fait presque tout ce que vous voulez :

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100)+.*(Stylus|2100)+';

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*';

Mais cela correspondra également à "210021002100", ce qui n'est pas génial.

1voto

Vous devez faire quelque chose comme ça,

SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';

o

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';

1 votes

Le second permet de faire l'idiot StylusStylus 210021002100 -- Pourquoi les + ? ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X