假设Facebook朋友的表格如下所示-userId | friendId
,您将如何编写SQL查询来查找两个朋友之间的共同朋友?我有以下适用于两个朋友A和B的代码。但是,我觉得它的优化程度不够,我希望可以用join进行相同的查询。我感到困惑的两个方面:
Stack Overflow /互联网上存在多个类似的问题,但似乎没有一个是100%准确的!
我正在寻找MS SQL服务器查询,但是任何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')
答案 0 :(得分:0)
您提供的查询是UNION,它返回A和B的朋友的并集。
下面的查询返回A和B的朋友的JOIN-与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的朋友,则它们中的任何一个都可以“忽略”另一个,因此数据库中可能有两个记录,“ X与Y的朋友”和“ Y与X的朋友”。来自X的初始请求创建第一条记录,来自Y的接受动作创建第二条记录。然后,每条记录都可以存储好友的帖子是否应显示在他人的供稿中。