2011-01-22 8 views
1

J'ai un tableau des prénoms et des noms.Condition SQL: (A = B ET C LIKE% D%) OU (A LIKE% B% ET C = D)

J'essaie de faire une recherche instantanée jQuery sur une entrée, afin de trouver très rapidement et précisément une personne dans une énorme liste de personnes.

Lorsque le premier mot est entré dans l'entrée, il peut s'agir du prénom ou du nom de famille.

Je fais ceci: SELECT * FROM myTable WHERE firstName LIKE %content% OR lastName LIKE %content%

Lorsque deux mots sont entrés, il pourrait être: * le prenom complet et un peu du nom * la pleine lastname et un peu de firstame

Alors J'ai essayé cette requête: SELECT * FROM myTable WHERE (firstName = content1 AND lastName LIKE %content2%) OR (lastName = content1 AND firstName LIKE %content2%)

Malheureusement parenthèse semble ne rien faire, et que la requête ne soit pas interprété de cette façon, j'ai beaucoup de résultats, essentiellement produit par l'état du deux comme

Quelqu'un a eu affaire à cela avant et pourrait me donner un coup de main?

Thanx

+1

juste pour préciser - dans votre deuxième requête, le contenu et%% de contenu représentent en fait de chaînes différentes, non? Donc, vous ne faites pas firstName = 'John Sm' ET lastName LIKE '% John Sm%', mais plutôt firstname = 'John' ET lastName LIKE '% Sm%'? –

+0

voulez-vous dire 'SELECT * FROM myTable OERE (firstName = content1 et lastname LIKE% content2%) OU (lastName = content2 ET firstName LIKE% content1%)'? –

+0

ouais mon erreur. juste au dessus. J'ai édité ma question – guillaumepotier

Répondre

1

Si l'un des mots va être le prénom complet du nom de famille complet, alors que l'autre mot est partiel de l'autre, pourquoi ne divisez-vous pas les mots en premier? Ensuite, vous feriez passer deux paramaters et ont:

SELECT 
    * 
FROM 
    myTable 
WHERE 
    (
     firstName = %content1% 
     AND lastName LIKE %content2% 
    ) OR (
     lastName = %content1% 
     AND firstName LIKE %content2% 
    ) 
+0

C'est presque la réponse. C'est plus LIKE contenu2% non? – guillaumepotier

+0

Comment cela peut-il être la réponse? "=%" ne donnera rien, n'est-ce pas? – RichardTheKiwi

+0

@ CoBaLt2760: vous avez raison - on dirait que j'ai eu un problème de formatage; Je l'ai corrigé. – Ray

0

Je crois que vous allez avoir besoin de séparer les deux mots saisis et de les utiliser indepenently dans votre requête.

0

Il marcherait probablement de cette façon (en supposant que les deux mots sont dans la variable de contenu):

SELECT ... WHERE 
    CONCAT(firstName, " ", lastName) LIKE content% 
    OR CONCAT(lastName, " ", firstName) LIKE content% 

Cependant, cette approche ne serait pas très efficace (pas d'utilisation d'index). Je diviser les deux mots en deux variables (word1, mot2) et en faire quelque chose comme:

SELECT ... WHERE 
    (firstName = word1 AND lastName LIKE word2%) 
    OR (lastName = word1 AND firstName LIKE word2%) 
+0

Thx pour votre réponse, vous aviez raison avec le contenu% et non% content% – guillaumepotier

0
SELECT * FROM myTable WHERE 
    (firstName = 'content1' AND lastName LIKE content2%) 
OR 
    (lastName = 'content1' AND firstName LIKE content2%) 
0

Lorsque deux mots sont entrés, il peut être: * la pleine prenom et un peu de le nom * plein et un peu lastname du firstame

Si elle est TOUS (correspondance exacte) le nom ou le prénom, le = test semble correct. Juste au cas où il s'agit d'une erreur dans la partie PHP, voici à quoi cela devrait ressembler.

$qry = ' 
SELECT * FROM myTable 
WHERE (firstName = content1 AND lastName LIKE '%".mysql_real_escape_string(content2)."%') 
    OR (lastName = content1 AND firstName LIKE '%".mysql_real_escape_string(content2)."%')'; 

Si elle est un peu des deux, alors vous avez besoin le caractère générique deux fois

$qry = ' 
SELECT * FROM myTable 
WHERE (firstName LIKE '%".mysql_real_escape_string(content1)."%' AND lastName LIKE '%".mysql_real_escape_string(content2)."%') 
    OR (lastName LIKE '%".mysql_real_escape_string(content1)."%' AND firstName LIKE '%".mysql_real_escape_string(content2)."%')'; 
Questions connexes