2016-06-07 2 views
0

Vu: table « peuple », et une chaîne « bob joe »Utilisation de mysql et déclaration comme un mot complet correspond à une requête

Retour: « bob une joe » rangée, pas la ligne bobby joel.

name 
'bob a joe' 
'ana l lee' 
'bobby joel' 

Je voudrais revenir SEULEMENT bob Joe, pas bobby joel:

SELECT name FROM people 
WHERE name Like '%bob%' 
AND name like '%joe%'; 

Ce code renvoie à la fois le bob et les cheveux. Les noms dans ma base de données ne sont pas toujours les premiers en dernier, ils sont parfois les derniers en premier, donc 'bob%' ne résout pas le problème. Il est vrai que

SELECT name FROM people 
WHERE name LIKE '%bob %' OR name LIKE '% bob%' 
AND name LIKE '%joe %' OR name LIKE '% joe%' 

résoudrait ce problème, mais je suis à la recherche d'un ou peut-être plus facile meilleure solution

Merci beaucoup Will

+1

comment sur 2 colonnes, et lastname dans firstname votre base de données? :) – Medda86

+0

'Où trim (nom) comme 'bob%' et trim (nom) comme '% joe' ne veulent pas le pourcentage au début ni à la fin. Je veux juste 2% de s Bien que ce soit extrêmement hackish comme bobby Joe serait retourné. La seule façon que je puisse voir pour vraiment faire ceci est de chercher le 1er espace à partir de la gauche et le premier espace à partir du prénom et du nom, puis de rejoindre ceux-là seulement. – xQbert

Répondre

0

Si vous souhaitez utiliser like pour trouver seulement compléter les mots dans un ordre donné, vous devez écrire toutes les 3 variations, car il n'y a pas de drapeau pour start of a word dans like. Donc, vous devez écrire

SELECT name FROM people 
WHERE (name LIKE 'bob %' OR name LIKE '% bob %' or name LIKE '% bob') 
    and (name LIKE 'joe %' OR name LIKE '% joe %' or name LIKE '% joe'); 

pour couvrir toutes les possibilités (début, milieu et fin).

Une autre possibilité (rapide) (à part de diviser les noms en colonnes séparées) pour trouver des mots complets est d'utiliser un fulltext search. L'index fulltext vous permettra de rechercher les mots complets qui ont une longueur minimale donnée par innodb_ft_min_token_size (pour InnoDB) et ft_min_word_len (pour MyISAM), vous pouvez définir ces options dans votre fichier de configuration. La valeur par défaut est 3 pour innodb et 4 pour myisam, donc 'joe' serait bien sur innodb. (Une autre chose à garder à l'esprit: il y a une table avec des mots anglais très communs qui ne seront pas inclus dans l'index, comme 'are' ou 'for' (l'index fulltext est normalement utilisé pour indexer des phrases entières plutôt que seulement les noms.) Vous pouvez changer cette table en réglant le stopwords options).

Ajoutez un index de texte intégral sur votre colonne(si vous modifiez les options, vous devez recréer l'index).

create fulltext index idx_ft_people_name on people (name); 

puis utilisez match against pour trouver les mots

select * from people 
where match(`name`) against ('+joe +bob' in boolean mode); 
0

Grande réponse Solarflare. J'aime beaucoup votre syntaxe sur cette déclaration beaucoup plus que la façon dont je l'ai eu, et c'est facile à construire dans une boucle for à travers mon manipulateur, qui est matlab.

Cette autre route semble difficile d'un point de vue technique, mais si je vois un grand décalage dans la première stratégie, je vais y recourir.

apprécie l'aide, Will