2010-11-22 4 views
6

Ich habe 2 Tabellen mit den Namen user und userFriend. Ich möchte alle Benutzer aus der Benutzertabelle und ein bestimmtes Mitglied aus der userFriend-Tabelle. Dann will ich sie beide verbinden ...wie bedingte Linke Verbindung schreiben

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 

Also, wenn meine Benutzer-ID = 1, dann will ich führen wie

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

so ich auf diese Weise für die 2. Tabelle bedingte will, ich Ich möchte nur eine zweite Tabelle mit userID = 1 mit der ersten Tabelle mit linker Verknüpfung verbinden.

+0

Könnten Sie Ihren Code ein wenig besser gestalten (verwenden Sie die Formatierungshilfe). In diesem Moment scheint es, dass Sie userID, userFriendID und friendUserID haben, während ich glaube, dass Sie nur zwei IDs benötigen. – Gidon

+0

Könnten Sie bitte Ihr Datamodel posten? Ich glaube, eine solche Anfrage impliziert, dass es stattdessen ein Problem gibt. –

+0

überprüfen Sie http://StackOverflow.com/Questions/1255492/Conditional-Join-In-Mysql – Singleton

Antwort

0

Für was Sie wollen, brauchen Sie keine Abfrage von beiden Tabellen. Wenn Sie userFriend verwenden, erhalten Sie die Daten. Sie benötigen die Benutzertabelle nur für Namen.

SELECT DISTINCT userID FROM userFriend 
WHERE friendUserID = ? 

dies finden Sie alle Benutzer geben, die die spezifischen Freund haben, die Sie benötigen. Optional können Sie ein INNER JOIN zu sehen hinzufügen, was die Namen sind:

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

UPDATE Ein Kommentar über Ihre Struktur. Sie benötigen die userFriendID nicht. Die Kombination aus Benutzer-ID und Freund-ID kann Ihr Schlüssel sein.

UPDATE der Abfrage

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

Dadurch werden Sie alle Benutzer zurück, die den Freund X. Die linke beitreten müssen, ist in dieser Abfrage nicht wichtig. Diese spezifische Bedingung macht es irrelevant.

Um genau das zu bekommen, was Sie wollen, müssen Sie dies ausführen.

Es kann mit einer Unterabfrage gemacht werden, aber ich denke nicht, ist die logischste Art der Organisation Ihrer Tabellen.

4

Es ist eine unkonventionelle Sache zu fragen ... aber das gibt Ihnen die Ergebnisse, die Sie wollen.

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