我有一个关于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个连接吗?
提前感谢您的帮助。
答案 0 :(得分:4)
我猜测people
和likes
之间存在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。