Mysql SQL好友列表查询

Mysql SQL好友列表查询,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我是这个数据库SQL语言的新手,所以我会尽量使它简单。(我正在使用MySQL工作台) 我有一个用户表,我希望多个用户彼此成为朋友。为此,我创建了一个friends表,其中有一个user_id和一个friend_user_id。我想把它理解为:“2是1和3的朋友,1是2的朋友,3是2的朋友”。所以当在这个朋友表上插入时,我从来没有做过这样的事情(1,2),(2,1)。我正在寻找一个过程,通过接收一个user\u id作为参数来返回他的所有朋友,无论他们是在user\u id列中还是在friend\

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

我有一个用户表,我希望多个用户彼此成为朋友。为此,我创建了一个friends表,其中有一个user_id和一个friend_user_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_friends(2)时,它应该出现

[1]
[3]

即使它们在friends表的不同列中。

您也可以使用中的
检查任一列是否等于您要查找的用户的ID以及
大小写。。。结束
以获取不等于要查找的用户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\u-id
user\u-friend\u-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;

但只有有这样的指数,这才更好。如果没有,它将需要在表上进行两次扫描,而第一种方法只需要一次。因此,在这种情况下情况更糟。

使用
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

尝试检查SQL连接