我只能在一个查询中执行此操作吗?

时间:2010-12-26 15:18:52

标签: sql mysql

大家圣诞快乐,

我了解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

我不知道是否可以在一个查询中完成?

提前感谢您的帮助。

2 个答案:

答案 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