首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >优化查询以在Facebook中找到共同的朋友

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

Stack Overflow用户
提问于 2019-05-19 08:17:34
回答 1查看 636关注 0票数 0

假设一个Facebook好友的表看起来像这样- SQL,那么您如何编写一个userId | friendId查询来查找两个好友之间的共同好友呢?我有下面的代码,可以为两个朋友A和B工作。然而,我觉得它还不够优化,我希望我可以用joins来做同样的查询。我感到困惑的两个领域:

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

在Stack Overflow/互联网上有多个类似的问题,但似乎没有一个是100%准确的!

我正在寻找一个MS SQL服务器查询,但任何SQL语言应该可以工作。

代码语言:javascript
复制
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')
EN

回答 1

Stack Overflow用户

发布于 2019-05-19 09:20:38

您提供的查询是一个UNION,它返回A和B的朋友的联盟。

下面的查询返回A和B的朋友的连接-A和B的朋友列表。

小提琴:DB-Fiddle

代码语言:javascript
复制
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的接受操作创建第二条记录。然后,每条记录都可以存储来自朋友的帖子是否应该显示在其他人的feed中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56203823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档