如何编写条件左连接

sne*_*eha 6 mysql left-join

我有2个名为user和的表userFriend.我希望用户表中的所有用户和userFriend表中的特定成员.然后我想加入他们两个......

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
Run Code Online (Sandbox Code Playgroud)

所以,如果我的userID = 1,那么我想要结果

userID   userName userFriendID  friendUserID      
2          bbb        1          2
3          ccc        NULL       NULL
4          ddd        3          4
5          eee        NULL       NULL
Run Code Online (Sandbox Code Playgroud)

所以这样我想要第二个表的条件,我只想加入第二个表,其中userID = 1,第一个表使用左连接.

Rie*_*sio 5

这是一个非常规的要求......但这会给你想要的结果。

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
Run Code Online (Sandbox Code Playgroud)


Elz*_*ugi 0

对于您想要的内容,您不需要从两个表中进行查询。只需使用 userFriend 即可为您提供数据。您只需要用户表来存储名称。

SELECT DISTINCT userID FROM userFriend
WHERE friendUserID = ?
Run Code Online (Sandbox Code Playgroud)

这将为您提供拥有您需要的特定朋友的所有用户。您可以选择添加 INNER JOIN 来查看名称:

SELECT DISTINCT f.userID, u.name 
FROM userFriend f
INNER JOIN users u ON u.userID = f.userID
WHERE friendUserID = ?
Run Code Online (Sandbox Code Playgroud)

更新 关于您的结构的评论。您不需要 userFriendID。用户 ID 和好友 ID 的组合可以作为您的密钥。

查询的更新

SELECT * FROM users u
LEFT JOIN userFriend f on u.userID = f.userID
WHERE f.friendUserID = ?
Run Code Online (Sandbox Code Playgroud)

这将返回所有拥有朋友 X 的用户。左连接在此查询中并不重要。这种特定条件使其无关紧要。

为了得到你想要的,你需要执行这个。

SELECT * FROM users u
LEFT JOIN (
    SELECT DISTINCT * FROM userFriend f
    WHERE friendID = 4
) x ON u.id = x.userId
Run Code Online (Sandbox Code Playgroud)

它可以使用子查询来完成,但我认为这不是组织表的最合乎逻辑的方式。