【发布时间】:2015-09-10 22:56:22
【问题描述】:
我有一个关于两次加入同一个表的 SQL 查询的基本问题。这听起来很简单,但我有一些麻烦。我希望,任何人都可以帮助我解决这个问题:)
我有两个小表:“peoples”(列:id、name、...)和“likes”(id、who、whom)。人们可以互相设置“喜欢”。这种关系是多对多的。 我想得到人们喜欢的桌子:收到的“喜欢”的数量,交付的数量和相互喜欢的数量。 当我只使用一个连接时,一切都是正确的。但是对于两个连接(或更多),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 个连接吗?
提前感谢您的帮助。
【问题讨论】:
-
您的加入看起来不错。但是,您应该确保按查询中未聚合的所有列进行分组。您没有在第二个查询中按
name分组。我无法忍受 MySQL 允许这样做。
标签: mysql sql join count group-by