web-dev-qa-db-fra.com

MySQL - Comment rechercher la correspondance exacte de Word avec LIKE?

J'utilise cette requête pour sélectionner des données:

mysql_query("SELECT * FROM products WHERE product_name LIKE '%".$search."%'");

Le seul problème est qu'il sélectionne parfois plus que je ne le souhaiterais.

Par exemple, je voudrais sélectionner le produit "BLA", mais ma requête sélectionner également le produit "BLABLA". Pour être clair, si je voulais sélectionner "Produit 1", je ne veux pas que la requête sélectionne "Produit 11".

Quelqu'un sait-il comment gérer cela?

Merci.

27
Mike

Voulez-vous simplement rechercher les limites de Word? Si c'est le cas, une version brute pourrait être:

SELECT * FROM products WHERE product_name LIKE "% foo %";

Ou vous pourriez être un peu plus intelligent et rechercher les limites de Word avec le REGEXP suivant

SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";
38
James C

J'ai trouvé cette question sur Google, donc je pense que certaines personnes peuvent toujours tomber dessus alors voici ma tentative assez inélégante:

SELECT * FROM products
WHERE product_name LIKE 'BLA %' #First Word proceeded by more words
OR WHERE product_name LIKE '% BLA' #Last Word preceded by other words
OR WHERE product_name LIKE '% BLA %' #Word in between other words
OR WHERE product_name = 'BLA'; #Just the Word itself

Vous n'êtes pas sûr de l'efficacité ou si cela couvre tous les cas, alors n'hésitez pas à voter contre si c'est vraiment inefficace ou trop inélégant.

8
PulpDood
SELECT  *
FROM    products
WHERE   product_name = 'BLA'

sélectionnera exactement BLA

SELECT  *
FROM    products
WHERE   product_name LIKE 'BLA%'

sélectionnera BLADDER et BLACKBERRY mais pas REBLAND

Pour sélectionner BLA comme premier mot de la chaîne, utilisez:

SELECT  *
FROM    products
WHERE   product_name RLIKE '^Bla[[:>::]]'
        AND product_name LIKE 'Bla%'

La deuxième condition peut améliorer les performances de votre requête si vous disposez d'un index sur product_name.

7
Quassnoi

Essayez d'utiliser des expressions régulières:

SELECT 
    *
FROM
    `products`
WHERE
    product_name regexp '(^|[[:space:]])BLA([[:space:]]|$)';
5
Faisal

Supprimez le mot clé LIKE et utilisez = pour une correspondance exacte

[~ # ~] modifier [~ # ~]

n'oubliez pas d'échapper à la saisie utilisateur en utilisant mysql_real_escape_string sinon votre requête échouera si quelqu'un entre des guillemets dans la zone de saisie.

$search=mysql_real_escape_string($search);
mysql_query("SELECT * FROM products WHERE product_name='".$search."'");
1
Shakti Singh

Alors n'utilisez pas LIKE, mais recherchez l'égalité.

c'est à dire.

mysql_query("SELECT * FROM products WHERE product_name = '".$search."'");

BTW J'espère que vous nettoyez/échappez à la recherche $ avant de l'utiliser dans une requête.

1
wimvds

vous pouvez utiliser une requête de sélection comme celle-ci, j'utilise également dans cakePHP et c'est utile.

Select * from `users` where username COLLATE latin1_general_cs LIKE '%$email%'
0
Rahul Dhiman

Utiliser égal (=)?

mysql_query("SELECT * FROM products WHERE product_name = '".$search."'"); 

Si vous cherchez à faire correspondre les mots EXACT, n'utilisez pas LIKE.

EDIT: Cela clarifie un peu les choses alors. Ajoutez simplement un espace après le terme de recherche. Ou même ajoutez le tiret (-) si c'est toujours dans le terme de recherche.

mysql_query("SELECT * FROM products WHERE product_name LIKE '".$search." -%'"); 
0
anothershrubery