2010-11-22 7 views
6

J'ai 2 tables nommées user et userFriend. Je veux tous les utilisateurs de la table des utilisateurs et des membres spécifiques de la table userFriend. Ensuite, je veux rejoindre les deux ...comment écrire une jointure conditionnelle à gauche

user 
userID userName 
1   aaa 
2   bbb 
3   ccc 
4   ddd 
5   eee 

userFriend 
userFriendID userID friendUserID 
1    1  2 
2    2  3 
3    1  4 
4    4  2 

Donc, si mon userID = 1, je veux résultat comme

userID userName userFriendID friendUserID  
2   bbb  1   2 
3   ccc  NULL  NULL 
4   ddd  3   4 
5   eee  NULL  NULL 

donc de cette façon que je veux conditionnelle pour la 2ème table, je seulement vouloir joindre la 2ème table ayant userID = 1 avec la 1ère table utilisant la jointure gauche.

+0

Pourriez-vous mieux structurer votre code (utilisez l'aide à la mise en forme). En ce moment, il semble que vous ayez userID, userFriendID et friendUserID, alors que je crois que vous avez seulement besoin de deux ID. – Gidon

+0

Pourriez-vous s'il vous plaît poster votre datamodel? Je crois qu'une telle demande implique qu'il y a un problème à la place. –

+0

consultez http://stackoverflow.com/questions/1255492/conditional-join-in-mysql – Singleton

Répondre

0

Pour ce que vous voulez vous n'avez pas besoin d'une requête des deux tables. Juste en utilisant userFriend vous donnera les données. Vous aurez besoin de la table des utilisateurs uniquement pour les noms.

SELECT DISTINCT userID FROM userFriend 
WHERE friendUserID = ? 

Cela vous donnera tous les utilisateurs qui ont cet ami spécifique dont vous avez besoin. vous pouvez éventuellement ajouter un INNER JOIN voir quels sont les noms:

SELECT DISTINCT f.userID, u.name 
FROM userFriend f 
INNER JOIN users u ON u.userID = f.userID 
WHERE friendUserID = ? 

MISE À JOUR Un commentaire sur votre structure. Vous n'avez pas besoin du userFriendID. La combinaison de userID et ID d'ami peut être votre clé.

Mise à jour de la requête

SELECT * FROM users u 
LEFT JOIN userFriend f on u.userID = f.userID 
WHERE f.friendUserID = ? 

Cela vous ramènera tous les utilisateurs qui ont l'ami X. La jointure gauche n'est pas important dans cette requête. Cette condition spécifique le rend non pertinent.

Pour obtenir exactement ce que vous voulez, vous devez l'exécuter. Cela peut être fait en utilisant une sous-requête, mais je ne pense pas que ce soit la façon la plus logique d'organiser vos tables.

4

C'est une chose non conventionnelle à demander ... mais cela vous donne les résultats que vous voulez.

SELECT u.userID, u.userName, uf.userFriendID, uf.friendUserID 
FROM user u 
LEFT JOIN userFriend uf ON u.userID = uf.friendUserID AND uf.userID =1 
WHERE u.userID !=1 
Questions connexes