我是这个数据库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表的不同列中。
答案 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_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;
但如果有这样的索引,这只会更好。如果没有,则需要在桌面上进行两次扫描,而第一种方法只需要一次扫描。所以在这种情况下情况更糟。
答案 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}}