web-dev-qa-db-fra.com

MySQL SELECT LIKE ou REGEX pour faire correspondre plusieurs mots dans un seul 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 cherchant 'Stylus 2100'?

Merci 

56
Alessio Firenze

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

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

Aussi, vous pouvez utiliser:

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

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

Dans MySql, il y a l'opérateur RLIKE et votre requête ressemblerait à ceci:
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
Je ne suis pas très fort en expression rationnelle, donc j'espère que l'expression est correcte.

Modifier
Le RegExp devrait plutôt être:

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

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

28
Ondrej Bozek

Vous pouvez simplement remplacer chaque espace par %

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
17
Melvin Protacio

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

Cela fait presque 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.

5
Martin

jetez un oeil sur http://www.techonthenet.com/sql/like.php

avec LIKE '% Stylus 2100%', vous demandez une chaîne contenant exactement 'Stylus 2100', et 'Stylus Photo 2100' ne contenant pas cette chaîne, il y a 'Photo' à l'intérieur;

3
divol

vous devez faire quelque chose comme ça,

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

ou 

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

En supposant que votre recherche est stylus photo 2100. Essayez l'exemple suivant utilise RLIKE.

SELECT * FROM `buckets` WHERE `bucketname` RLIKE REPLACE('stylus photo 2100', ' ', '+.*');

MODIFIER

Une autre méthode consiste à utiliser FULLTEXT index sur la syntaxe bucketname et MATCH ... AGAINST dans votre instruction SELECT. Donc, pour réécrire l'exemple ci-dessus ...

SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));
0
Peter Darmis

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

0
Gopalakrishnan