2010-03-14 20 views
0

je la requête MySQL suivante:Nom MySQL LIKE '% # attributes.q #%' --- Ne renvoie pas de résultat pour une correspondance exacte?

SELECT * 
FROM customer 
WHERE 
fName LIKE '%#attributes.q#%' AND deleted = 'N' 
OR 
lName LIKE '%#attributes.q#%' AND deleted = 'N' 

Cela fonctionne très bien pour des suppositions, mais si vous fournissez une correspondance exacte: « Bill Clinton » fname = facture lname = clinton à la requête ci-dessus vous obtenez 0 résultats? où Bill Clint donne des résultats.

Comment cette requête peut-elle être mise à jour pour dire trouver le résultat LIKE et les résultats EQUAL TO?

+0

Je n'arrive pas à comprendre ce que vous cherchez. Fname = 'prénom' et lname = 'nom de famille'? Votre exemple de requête, l '«explication» ci-dessous et la question à la fin ne semblent pas appartenir ensemble. Pouvez-vous s'il vous plaît réduire à SQL seulement et reformuler la question! – lexu

+0

Je ne connais pas la notation "# attributes.q #", mais vous semblez fournir la même valeur pour les correspondances fName et lName. – Martin

Répondre

2

Difficile à dire de votre question, mais je devine votre tableau de clients ressemblera à quelque chose comme:

id fName lName  deleted 
--------------------------------- 
1  John  Doe  N 
2  Bill  Clinton N 
3  Fred  Smith  N 
4  George Bush  Y 

Votre requête, comme vous l'avez dit dans votre question, ne fonctionnera jamais, comme ressemblera à ceci:

SELECT * 
FROM customer 
WHERE fname LIKE '%Bill Clinton%' AND deleted = 'N' 
OR 
    lName LIKE '%Bill Clinton%' AND deleted = 'N' 

Il n'y a pas enregistrements dans la table où les champs FNAME OU lName contiennent « Bill Clinton »

Vous devrez masser votre texte # # attributes.q de façon cela va générer quelque chose comme ceci:

SELECT * 
FROM customer 
WHERE ((fName LIKE '%Bill%') OR (fName LIKE '%Clinton%')) AND deleted = 'N' 
OR 
    ((lName LIKE '%Bill%') etc..... 

Les comparaisons LIKE ressemblent beaucoup à l'utilisation de caractères génériques dans les noms de fichiers. Ils ne diviseront pas un bloc de texte pour vous, mais vous diront si un morceau de texte existe, mot pour mot, dans un autre morceau de texte.

Je pense que ce dont vous avez besoin est un FULLTEXT search, qui considérera les mots individuels dans une chaîne de requête et retournera les résultats. Bien sûr, FULLTEXT n'est disponible que sur les types de tables MyISAM, donc si vous utilisez InnoDB ou un autre type, vous n'avez pas de chance.