Sid*_*dul 2 mysql sql mysql-workbench
我是这个数据库 SQL 语言的新手,所以我会尽量让它变得简单。(我正在使用 MySQL 工作台)
我有一个用户表,我希望多个用户成为彼此的朋友。为此,我创建了friends 表,其中包含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]
Run Code Online (Sandbox Code Playgroud)
即使这些在朋友表的不同列中。
您可以使用IN检查任一列是否等于您要查找的用户的 ID,并使用 aCASE ... 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);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用一种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;
Run Code Online (Sandbox Code Playgroud)
但这只有在有这样的索引时才会更好。如果没有,它可能需要在桌子上进行两次扫描,而第一种方法只需要一次。所以在这种情况下情况更糟。