2010-09-12 5 views
2

Si je recherche LENA, je veux seulement obtenir des résultats où LENA est un mot et ne fait pas partie d'un mot comme Lenason ou Anna-Lena ou Malenaphp problème générique de requête mysql recherche

Comment puis-je écrire comme un requête, pas

"select * from users where name like '%LENA%'" 

Que devrait-il être à la place?

+0

Je vous vois non accepté ma réponse; Qu'est ce qui ne s'est pas bien passé? – NullUserException

Répondre

1

Vous pouvez utiliser REGEXP:

SELECT fields 
    FROM users 
WHERE name REGEXP '(^|\s+)LENA($|\s+)' 
1

Vous pourriez être mieux regarder dans Full Text Search pour cela.

Sinon, je pense que vous êtes coincé faire quelque chose comme ça

"select * from users WHERE CONCAT(' ',name, ' ') like '% LENA %'" 

qui sera assez inefficace car elle nécessite une analyse complète de la table.

+1

** Recherche plein texte ** ferait l'affaire, mais votre "quelque chose comme" requête donnera des résultats identiques à l'original (mais avec plus de frais généraux de cpu). –

+0

@Bob - Vous aviez raison de dire qu'il y avait un problème avec ma requête mais pas celui auquel vous pensiez. J'ai oublié que vous deviez utiliser 'CONCAT' pour la concaténation de chaînes dans MySQL plutôt que' + '. La raison de la concaténation des espaces est que les noms où 'lena' est le premier, le dernier ou le seul mot ne correspondraient pas à la clause where' name like '% LENA%' 'sans cela. –

+0

A recherché '%' dans le manuel de MySQL et il correspond également 'zéro caractères '. C'était la faille dans ma logique. –

4

Utilisez celui-ci:

select * from users where name like '% LENA %' OR name like 'LENA %' OR name like '% LENA' OR name like 'LENA' 

Essayez, cela fonctionnera, et trop simple avec 2 places au début et à la fin. Sa requête longue mais rapide. Vous pouvez également utiliser Full Text Search, Concat, Regex ... mais pour moi, j'aime bien, il suffit d'ajouter de l'espace avant%.

Cependant, vous pouvez essayer plus court mais plus lente requête:

SELECT * FROM users WHERE name REGEXP '(^|\s+)LENA($|\s+)'