同一张表上的多个联接,只计算一个查询

Jul*_*jan 4 mysql sql join group-by count

我有一个关于SQL查询的基本问题,即两次将同一张表连接在一起。听起来很简单,但是我有一些麻烦。我希望任何人都可以帮助我解决这个问题:)

我有两个小表:“人民”(列:id,姓名,...)和“喜欢”(id,谁,谁)。人们可以彼此设置“喜欢”。这种关系是多对多的。我想得到人们喜欢的桌子:收到的“喜欢”的数量,传递的数量和相互喜欢的数量。当我仅使用一个联接时,一切都正确。但是对于两个联接(或更多联接),MySQL组合了所有行(如预期的那样),并且计数得到错误的值。我不知道在这种情况下如何必须使用count / sum / group-by运算符:(我想在一个查询中没有子查询的情况下执行此操作。

我使用了这样的查询:

SELECT *, count(l1.whom), count(l2.whom)
FROM people p
LEFT JOIN likes l1 ON l1.who = p.id
LEFT JOIN likes l2 ON l2.whom = p.id
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)

SELECT p.id, name, 
   count(lwho.who) delivered_likes, 
   count(lwhom.whom) received_likes, 
   count(lmut.who) mutual_likes
FROM people AS p
LEFT JOIN likes AS lwho ON p.id = lwho.who
LEFT JOIN likes AS lwhom ON lwhom.id = lwho.id
LEFT JOIN likes AS lmut ON lwhom.who = lmut.whom AND lwhom.whom = lmut.who
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)

但这是计算出的“不喜欢”次数。

仅出于培训和性能的问题并不重要,但是我想我的上一个查询中的三个联接太多了。我可以使用2个联接吗?

在此先感谢您的帮助。

小智 6

我推测people和之间存在1:N关系likes

据我所知,第二个查询的一个问题是的lwhom相关性likeslwho通过via 联接id=id。基本上lwhom lwho。我建议将此关联的ON子句从lwhom.id = lwho.id更改为p.id = lwhom.whom

但是,计数仍将受JOIN的影响。但是,假设您在likes表中有一个ID列,那么您可以将每个人的身分COUNT统计为不同的Like ID(如果不是),请考虑使用COUNT(DISTINCT correlation.*)改用。

除了题外话,以下应该有望工作:

SELECT p.id, name, 
   count(distinct lwho.id) delivered_likes, 
   count(distinct lwhom.id) received_likes, 
   count(distinct lmut.id) mutual_likes
FROM people AS p
LEFT JOIN likes AS lwho ON p.id = lwho.who
LEFT JOIN likes AS lwhom ON p.id = lwhom.whom
LEFT JOIN likes AS lmut ON lwhom.who = lmut.whom AND lwhom.whom = lmut.who
GROUP BY p.id,p.name;
Run Code Online (Sandbox Code Playgroud)

在这里有一个SQL Fiddle 。