假设Facebook朋友的桌子看起来像这样-userId | friendId
,您将如何编写SQL查询以在两个朋友之间找到共同的朋友?我有以下代码适合两个朋友A和B。但是,我觉得它不够优化,我希望我可以与加入相同的查询。我感到困惑的两个领域:
- 特定的用户ID可以根据谁发起的朋友请求而在任何一列中。如果A发送给B的请求,则用户ID将为A,而FriendId将为B。以下查询我处理此情况,但是您将如何使用JOIN?
- FB如何建议将某人加成朋友?在查询中看起来如何?
堆栈溢出/互联网上有多个类似的问题,但似乎没有100%准确!
我正在寻找MS SQL Server查询,但任何SQL语言都可以起作用。
SELECT *
FROM (
SELECT CASE WHEN userId = 'A' THEN friendId ELSE userId END AS mutualFriends
FROM friendsTable
WHERE userId = 'A' OR friendId = 'A'
UNION
SELECT CASE WHEN userId = 'B' THEN friendId ELSE userId END AS mutualFriends
FROM friendsTable
WHERE userId = 'B' OR friendId = 'B'
) A
WHERE mututalFriends NOT IN ('A','B')
您提供的查询是一个联盟,它返回了a和b。
的朋友联盟下面的查询返回A和B的朋友的联接 - 与A和B。
的朋友列表小提琴:db-fiddle
SELECT a_mutualfriendid AS mutualfriendid FROM
(SELECT distinct a_mutualfriendid
FROM (SELECT
case
when userid = 'A' then friendid
else userid
end as a_mutualfriendid
FROM friendsTable
WHERE userid in ('A') or friendid in ('A')
) a_friends
WHERE a_mutualfriendid NOT IN ('B')) a
INNER JOIN
(SELECT distinct b_mutualfriendid
FROM (SELECT
case
when userid = 'B' then friendid
else userid
end as b_mutualfriendid
FROM friendsTable
WHERE userid in ('B') or friendid in ('B')
) b_friends
WHERE b_mutualfriendid NOT IN ('A')) b
ON a_mutualfriendid = b_mutualfriendid
至于Facebook如何存储数据,即专有信息,员工可能无法回答。
这是一个猜测:请记住,如果X是与Y的朋友,他们中的任何一个都可以"忽略"另一个,数据库中可能有两个记录:"与Y"one_answers"与X的朋友"。X的初始请求创建了第一个记录,而Y的接受操作创建了第二个记录。然后,每个记录都可以存储朋友的帖子是否应在他人的提要中显示。