假设一个Facebook好友的表看起来像这样- SQL,那么您如何编写一个userId | friendId
查询来查找两个好友之间的共同好友呢?我有下面的代码,可以为两个朋友A和B工作。然而,我觉得它还不够优化,我希望我可以用joins来做同样的查询。我感到困惑的两个领域:
在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')
发布于 2019-05-19 09:20:38
您提供的查询是一个UNION,它返回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是朋友,那么他们中的任何一个都可以“忽略”另一个,数据库中可能有两个记录,"X与Y的朋友“和"Y与X的朋友”。来自X的初始请求创建第一条记录,来自Y的接受操作创建第二条记录。然后,每条记录都可以存储来自朋友的帖子是否应该显示在其他人的feed中。
https://stackoverflow.com/questions/56203823
复制相似问题