mysql comme pour correspondre à un mot complet ou début de mot sur la chaîne
Donné une chaîne de recherche j'ai besoin de sélectionner tous les enregistrements où (dans le champ de la recherche est effectuée sur) il y a au moins un mot qui commence avec le texte donné.
Par exemple:
'John Doe'
Doivent être sélectionnés avec les chaînes de recherche comme:
'joh'
'do'
'JOHN doe'
Ont pas être sélectionné avec
'ohn'
'oe'
J'ai besoin (peut-être) pour éviter de recherche de texte intégral.
Ce que j'ai trouvé du travail est
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
Je me demande si il y a une meilleure façon de le faire.
(pour une "meilleure façon", je veux dire de meilleures performances ou même performance mais plus élégant)
Aussi, que la requête devrait être construit avec une déclaration préparée, comment dois-je ne pas encoder COMME des caractères dans la chaîne de recherche?
OriginalL'auteur Paolo | 2013-10-31
Vous devez vous connecter pour publier un commentaire.
Utiliser ceci:
Vous n'avez pas besoin de la
OR
condition: si un champ correspond àsearch%
, il correspond aussi à la%search%
.LIKE
ne peut pas faire mot correspondant, c'est juste correspond à des chaînes.Vous devez utiliser un
RLIKE
au lieu deLIKE
et de créer une expression régulière. La même approche de base fonctionne toujours, vous avez juste à utiliser l'expression régulière qui correspond au début d'un mot à la place de la première%
.OriginalL'auteur Barmar
Comme déjà dit dans la question, la requête
travaux pour la mise en correspondance des enregistrements où le
SEARCHFIELD
contient un mot qui commence par (ou égale à)$searchText
Ce qui concerne la performance, j'ai fait un test sur ma machine de développement
MBP 2,2 GHz i7 quad core
:Recherche d'un mot sur 4.000 dossiers prend environ 40 millisecondes.
Dossiers sont normalement indexé (pas fulltext).
J'ai quelques milliers d'enregistrements et la requête ne s'exécute pas très souvent, donc, pour moi, est bon.
La solution peut ne pas être adapté à d'autres contextes.
Pour construire une requête préparée avec la requête ci-dessus j'ai utilisé la technique décrite ici:
Échapper à MySQL wild cards
Le code résultant est comme suit:
OriginalL'auteur Paolo