大家圣诞快乐,
我了解SQL,但我很难搞清楚这一点。
首先是我的表格(例子)
用户
id
name
朋友
from //userid
to //userid
如果用户1是用户10的朋友 然后你连续1,10。 如果用户10不是用户1的朋友,则用户1不能与用户10成为朋友 所以你有了 1,10 10,1
它可能看起来很奇怪,但每个关系需要这两行。
现在,我正在尝试进行查询,以选择与给定用户拥有最多共同朋友的用户。
例如,用户1是用户10,9和7的朋友,用户8是10,9和7的朋友,我想建议用户1邀请他(如facebook)。
我希望像第一个拥有最多共同朋友的人一样。
输出就像
用户,NumOfMutualFriends
我不知道是否可以在一个查询中完成?
提前感谢您的帮助。
答案 0 :(得分:4)
SELECT u1.id, COUNT(*) FROM
user as u1, user as u2, friend as f1, friend as f2
WHERE u1.id = f1.to AND u2.id = f1.from AND -- f1 and f2 are friends
u2.id = f2.to AND f2.from = 1234 -- and f2 is my friend, so I have a mutual friend with f1
GROUP BY u1.id
EDIT1: 这只是一个普遍的想法。请注意,计数将不准确,将有重复。您必须使用一些真实数据来调整查询以消除所有重复项(或找到真正的DBA)
EDIT2: 此外,我怀疑这可能是不现实的,因为你实际上是在为一个用户数量至少有n ^ 4个结果进行连接。即使你有100个也会变得非常糟糕。所以我很确定Facebook正在做一些有趣的事情。不知道是什么。
答案 1 :(得分:0)
如果用户1是用户10的朋友,那么你就是1,10的行。如果用户10不是用户1的朋友,则用户1不能与用户10成为朋友,因此您有1,10 10,1
它可能看起来很奇怪,但每个关系需要这两行。
在这种情况下,你实际上并没有。 :)这就是所谓的“冗余”。请注意,如果在这种情况下只保留“非重复”条目,则可以使用简单查询或视图模拟现有内容。因此,您无需复制表格中的数据。
对于你的问题,答案如下:
SELECT User.id, COUNT(friend.to)
FROM User
LEFT JOIN friend ON User.id = friend.from
WHERE friend.to = 12345 --your target user id goes here
GROUP BY User.id
ORDER BY COUNT(friend.to) DESC