需要SQL专家的帮助。快速浏览我要查询的两个表的结构。
用户表
朋友表
例如,如果我们在数据库中有三个用户ID为1,2,3,他们的名字分别是Rob,John和Adam。
如果Rob和John是朋友,那么friends表有以下两个条目:
id toid fromid
1 1 2
2 2 1
还有一些情况,即friends表中只有一个条目。如果一个人发送了请求但收件人尚未例外,则会发生这种情况。
我想要完成的是为特定用户选择朋友的所有ID和名称。 (朋友是在朋友表中同时拥有两个条目的朋友,而不只是一个)。
到目前为止,我所尝试的内容为我提供了发送或接收特定用户请求的朋友和用户的ID列表。下面是我最接近的。
SELECT DISTINCT
users.ID用户ID users.name名称
来自用户
INNER JOIN朋友
ON users.id = friends.fromid OR users.id = friends.toid
WHERE(friends.fromid = 1 OR friends.toid = 1)AND users.ID!= 1
答案 0 :(得分:4)
这将为您提供与@userID
具有双向友谊的ID列表。
检查 Fiddle Demo
INSERT INTO friends
(`ID`, `toid`, `fromid`)
VALUES
(1, 1, 2),
(2, 2, 1),
(3, 1, 3),
(4, 3, 1),
(5, 2, 3)
;
@userID = 1
您获得{2, 3}
@userID = 2
您获得了{1}
//2 sent to 3 but not receive it back
@userID = 3
您获得{1}
QUERY
SELECT CASE WHEN toid = @userID THEN fromid
ELSE toid
END as myFriendID
FROM friends
WHERE toid = @userID OR fromid = @userID
GROUP BY LEAST(toid, fromid), GREATEST(toid, fromid)
HAVING COUNT(*) = 2