优化查询以在Facebook中找到共同的朋友

时间:2019-05-19 00:17:34

标签: sql facebook mutual-friendship

假设Facebook朋友的表格如下所示-userId | friendId,您将如何编写SQL查询来查找两个朋友之间的共同朋友?我有以下适用于两个朋友A和B的代码。但是,我觉得它的优化程度不够,我希望可以用join进行相同的查询。我感到困惑的两个方面:

  1. 根据发起好友请求的人,特定用户ID可以位于任一列中。如果A向B发送了一个请求,则userId将为A,friendId将为B。我下面的查询处理了这种情况,但是如何对JOIN执行相同的操作?
  2. FB如何建议将某人添加为朋友?在查询中会是什么样子?

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')

1 个答案:

答案 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的接受动作创建第二条记录。然后,每条记录都可以存储好友的帖子是否应显示在他人的供稿中。