2010-11-05 7 views
0

Y at-il un moyen de rendre cette requête plus rapide:Simplifier/accélérer requête SQL

$qur = mysql_query(" 
SELECT id, firstname, lastname, 
(firstname = '$firstname' AND lastname = '$lastname') AS full FROM users 
WHERE (firstname = '$firstname' AND lastname='$lastname') 
OR (firstname LIKE '$firstname%' AND lastname LIKE '$lastname%') 
OR firstname LIKE '$firstname%' OR lastname LIKE '$firstname%' 
ORDER BY (firstname = '$firstname' AND lastname='$lastname') DESC"); 

Ce que je dois en ceci:

Check if its a full match. 
Get firstname lastname 
Being able to only enter lastname "Fox" and let it find the firstname (get all users with lastname Fox, and show their firstname too and display check the script at bottom.) 
Being able to only enter the firstname "Megan" and let it find the lastname (^) 
Being able to only enter Megan F, and let it show "Megan Fox" 
Being able to only enter Me Fox, and let it show "Megan Fox" 

C'est ce qu'il fait pour moi, travailler sans aucune problème. Bien que je pense peut-être que ce serait courir lentement lorsque beaucoup d'utilisateurs l'exécuter

Je l'utilise avec ceci:

if (mysql_num_rows($qur) == 1) { 

$get = mysql_fetch_array($qur); 
    if($get["full"] == 1){ 
    echo $get["id"]; 
    }else{ 
    echo "Did you mean: ".$get["firstname"]." ".$get["lastname"]." ?"; 
    } 
}elseif(mysql_num_rows($qur) > 1){ 
    while($get = mysql_fetch_array($qur)) { 
     $name[] = $get["firstname"]." ".$get["lastname"]; 
    } 

    if(count($name) > 1) { 
     echo 'Who did you mean?<br>'; 
    } else { 
     echo 'Did you mean: '; 
    } 
    echo implode('<br>', $name); 

} 
+0

ne devrait-il être "CONCAT (prenom, '', nom) à part entière" au lieu de « (prenom = '$ prenom' ET lastname = '$ lastname') AS plein "? –

+1

@Paulo Je ne pense pas que c'est ce qu'il veut. Il veut un équivalent booléen pour quand il y a un match complet. – cwallenpoole

+0

@Oui Christopher – Johnson

Répondre

1

Vous pouvez raccourcir la requête:

$qur = mysql_query(
"SELECT id, firstname, lastname, 
(firstname = '$firstname' AND lastname = '$lastname') AS full FROM users 
WHERE firstname LIKE '$firstname%' AND lastname LIKE '$lastname%' 
ORDER BY (firstname = '$firstname' AND lastname='$lastname') DESC"); 

LIKE '...%' couvre ici tous les cas. Mais en dehors de cela, peut-être que vous devriez regarder dans MyISAM's FULLTEXT search, qui donnera probablement de meilleurs résultats. PS: J'espère que vous avez échappé $firstname et $lastname avant de les insérer dans la requête!

1

regard sur lucene (et here). Cela rendra les requêtes de pertinence plus faciles à travailler.

+0

Il n'y a rien sur la pertinence ici. Je ne connais pas lucene, mais je connais Sphinx Search et ce serait totalement exagéré dans ce cas. – AndreKR

1

Le SQL ne correspond pas à votre description, car le SQL trouvera également Megan McAllister lorsque "Megan" et "F" sont entrés car OR firstname LIKE '$firstname%' est suffisant pour satisfaire la condition.

Votre description se traduit par SQL comme ceci:

WHERE firstname LIKE '$firstname%' AND lastname LIKE '$lastname%' 

Je pense que vous devez mettre la logique de « match plein » dans un autre SQL ou vous devez sortir de la boucle/itérer sur les résultats dans un premier passage pour vérifier s'il s'agit d'un match complet. Pensez au cas où il y a un Mega Fox et un Megana Foxy: Vous obtiendrez deux rangées, bien qu'il y ait une correspondance complète.

Voici une suggestion pour une logique de "match plein":

unset($name); unset($id); 

while ($get = mysql_fetch_array($qur)) 
{ 
    $name []= $get["firstname"]." ".$get["lastname"]; 
    if ($get['full']) 
    { 
     $id = $get['id']; 
     break; 
    } 
} 

if ($id) 
    echo $id; 
elseif ($name) 
    echo implode('<br>', $name); 
else 
    echo 'Nothing found'; 
+0

Il serait beaucoup plus facile et beaucoup plus cohérent de décomposer ceci en quelques requêtes différentes avec des conditions de chute. – cwallenpoole

+0

Merci pour votre réponse AndreKR. Ok, oubliez ma question alors, comment feriez-vous cela (s) si vous deviez remplir la description? Pourriez-vous me montrer en utilisant un autre SQL pour le match complet et ainsi? – Johnson

+0

C'est juste le O WH j'ai donné dans la réponse. Et pour la logique, j'ai mis à jour la réponse (car je ne pense pas que le formatage du code fonctionne dans les commentaires) avec une suggestion. Et s'il vous plaît faites attention que vous utilisez addslashes et htmlentities. – AndreKR