sql好友列表查询

osh3o9ms  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(398)

我是这个数据库sql语言的新手,所以我会尽量使它简单(我正在使用mysql工作台)
我有一个用户表,我希望多个用户成为彼此的朋友。为此,我创建了friends表,其中有一个user\u id和friends\u user\u id。我想把它理解为:“2是1和3的朋友,1是2的朋友,3是2的朋友”。所以在这个朋友表上插入时,我从来没有这样做过(1,2),(2,1)。我正在寻找一个过程,通过接收一个user\u id作为参数来返回他的所有朋友,无论他们是在user\u id列还是在friend\u user\u id列中。例如,如果我查找用户2的朋友,它应该显示1列,其中有1和3,因为1和3是2的朋友。
更具体地说,当我打电话给get\u friends(2)时,它应该出现

[1]
[3]

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

uqjltbpv

uqjltbpv1#

使用 UNION ALL 若要获取所有好友,请参数化此查询:

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
j7dteeu8

j7dteeu82#

你可以用 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_id 或者 user_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;

但只有有这样的索引,这才更好。如果没有,它需要两次扫描,而第一次扫描只需要一次。所以这种情况更糟。

相关问题