在一个查询中计数的同一个表上的多个连接

时间:2015-06-24 16:10:04

标签: mysql sql join count group-by

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

我有两张小桌子:"人民" (列:id,name,...)和"喜欢" (id,who,who)。人们可能会设置喜欢"喜欢"对彼此。这种关系很多很多。 我想要与人们喜欢的桌子:收到的数量"喜欢",交付和相互喜欢的数量。 当我只使用一个连接时,一切都正确。但是对于两个连接(或更多)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;

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;

但它计算了不合适的数量。

这个问题只是针对培训和性能并不重要,但我想,我上次查询中的三个连接太多了。我可以使用2个连接吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

我猜测peoplelikes之间存在1:N的关系。

据我所知,您的第二个查询存在的一个问题是,lwhom的{​​{1}}相关性已通过likes加入lwho。基本上id=id lwhom。我建议将此关联的ON子句从lwho更改为lwhom.id = lwho.id

然而,计数仍将受到JOIN的影响。假设您在p.id = lwhom.whom表中有一个ID列,那么您可以让每个likes为每个人设置不同的ID ID - 如果不是,请考虑仅使用COUNT。< / p> 除了弃用之外,以下内容应该有效:

COUNT(DISTINCT correlation.*)

我有一个SQL小提琴here