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
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%'
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
Vous pouvez simplement remplacer chaque espace par %
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
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.
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;
vous devez faire quelque chose comme ça,
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';
ou
SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';
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', ' ', ','));
SELECT name
FROM table
WHERE name
LIKE '% Stylus% 2100%'