SQL好友列表查询

时间:2018-06-17 16:34:24

标签: mysql sql mysql-workbench

我是这个数据库SQL语言的新手,所以我会尽量让它变得简单。 (我正在使用MySQL Workbench)

我有一个用户桌,我希望多个用户成为彼此的朋友。为此,我创建了friend表,其中包含user_id和friend_user_id。所以,让我们说(1,2),(2,3)。我希望将其读作:" 2是1和3的朋友,1是2的朋友,3是2"的朋友。因此,当插入这个朋友表时,我从不做这样的事情(1,2),(2,1)。我正在寻找一个过程,通过接收user_id作为参数来返回他的所有朋友,无论他们是在user_id列还是在friend_user_id列中。例如,如果我查找用户2的朋友,它应该显示1列1和3,因为1和3是2的朋友。

更具体地说,当我调用get_friends(2)时,它应该出现

[1]
[3]

即使这些在Friends表的不同列中。

2 个答案:

答案 0 :(得分:2)

您可以使用IN检查任一列是否等于您要查找的用户的ID,以及CASE ... END取得的列不等于用户的ID你想抬头看。

SELECT CASE
         WHEN user_id = 2
           THEN user_friend_id
         WHEN user_friend_id = 2
           THEN user_id
       END friend
       FROM friends
       WHERE 2 IN (user_id, user_friend_id);

或者,您可以使用UNION ALL方法,该方法可能会更好,因为它可以使用user_iduser_friend_id上的索引。

SELECT user_id friend
       FROM friends
       WHERE user_friend_id = 2
UNION ALL
SELECT user_friend_id friend
       FROM friends
       WHERE friend_id = 2;

但如果有这样的索引,这只会更好。如果没有,则需要在桌面上进行两次扫描,而第一种方法只需要一次扫描。所以在这种情况下情况更糟。

答案 1 :(得分:0)

使用select friend_user_id as friend_id from friends f where f.user_id = 2 --parameter union all select user_id as friend_id from friends f where f.friend_user_id = 2 --parameter 获取所有朋友,参数化此查询:

{{1}}