2010-11-07 7 views
0

Je souhaite que les utilisateurs ne peuvent envoyer à leurs amis. En ce moment j'ai ceci:SQL: Seulement montrer des amis

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

Cela montre tous les utilisateurs qui sont comme $ prenom, $ lastname

Maintenant, je l'ai essayé de ne faire que sélectionner les amis de D'UTILISATION $ prenom, lastname $, en ajoutant ceci:

INNER JOIN users_friends ON users.id=users_friends.uID 
WHERE users_friends.bID='$USER' AND users_friends.type = '$typeUsers' AND 

il a obtenu comme ceci:

$qur = mysql_query(" 
SELECT users.id, users.firstname, users.lastname, 
(users.firstname = '$firstname' AND users.lastname = '$lastname') AS full FROM users 
    INNER JOIN users_friends ON users.id=users_friends.uID 
WHERE users_friends.bID='$USER' AND users_friends.type = '$typeUsers' AND 
(users.firstname = '$firstname' AND users.lastname='$lastname') 
OR (users.firstname LIKE '$firstname%' AND users.lastname LIKE '$lastname%') 
OR users.firstname LIKE '$firstname%' OR users.lastname LIKE '$firstname%' 
ORDER BY (users.firstname = '$firstname' AND users.lastname='$lastname') DESC") or die(mysql_error()); 

S'il existe 4 au total avec « renard » lastname, et je ne suis que des amis avec 1 d'entre eux avec prenom « megan », il crache sur ceci:

Megan Fox 
Megan Fox 
Mami Fox 
Mimi Fox 
Mumu Fox 

Comme vous pouvez le voir ici, il recrache « Megan Fox (avec qui je suis ami) "deux fois. Et je pense que c'est parce que quelque part dans le SQL, il crache tout le monde, et puis il recrache l'ami. Mais comment puis-je ne pas cracher tout le monde, mais seulement mon ami?

Répondre

2

C'est parce que l'opérateur est prioritaire. L'expression x and y or z n'évalue pas comme x and (y or z) mais comme (x and y) or z. par conséquent, la limitation d'ami s'applique uniquement à la première façon de faire correspondre les noms.

Vous avez besoin des parenthèses autour des conditions de nom:

WHERE users_friends.bID='$USER' AND users_friends.type = '$typeUsers' AND (
(users.firstname = '$firstname' AND users.lastname='$lastname') OR 
(users.firstname LIKE '$firstname%' AND users.lastname LIKE '$lastname%') OR 
users.firstname LIKE '$firstname%' OR 
users.lastname LIKE '$firstname%' 
) 

Dans le cadre de la condition de se joindre à la table d'amis n'est appliquée pour certains des dossiers, vous rejoindrez dans les documents d'autres utilisateurs ont également . La raison pour laquelle Megan Fox apparaît deux fois est très probablement parce qu'elle est amie avec quelqu'un d'autre aussi, alors elle apparaît deux fois dans la table des amis.

+0

Merci pour l'explication! – Johnson

Questions connexes