为特定用户选择所有朋友的ID

时间:2016-07-12 20:35:24

标签: mysql sql database

需要SQL专家的帮助。快速浏览我要查询的两个表的结构。

  • 用户表

    • id - (int)主键
    • 名称 - (字符串)
  • 朋友表

    • id - (int)主键
    • toid - int
    • fromid - int
朋友表持有用户之间的友谊关系。棘手的部分是它每个友谊拥有两个记录。

例如,如果我们在数据库中有三个用户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

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