2015-06-24 53 views
1

我有两个连接同一个表的SQL查询的基本问题。这听起来很简单,但我有一些麻烦。我希望,任何人都可以帮我解决这个问题:)在一个查询中计数的同一个表上的多个连接

我有两个小表:“人”(列:id,name,...)和“likes”(id,who,who)。人们可以设置彼此的“喜欢”。这种关系是多方面的。 我想得到与人民喜欢的表:收到“喜欢”的数量,交付和相互喜欢的数量。 当我只使用一个连接时,所有的都是正确的。但是对于两个连接(或更多),MySQL将所有行组合(如预期的那样),并且计数中出现错误的值。我不知道,我必须如何在这种情况下使用count /总和/组,由运营商:(我想在一个查询做到不子查询

我用这样的查询:

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

你的加入看起来很好。但是,您应该确保按查询中的所有列对您进行分组,而不是按照您的第二个查询中的“name”进行分组。我无法忍受MySQL允许这样做。 – Andrew

回答

2

我推测peoplelikes之间存在1:N关系。你的第二个查询

一个问题,据我所知,是的likeslwhom相关性通过id=id加入到lwho。基本上lwhomlwho。我建议将此关联的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; 

我有一个SQL小提琴here

+0

嘿,亚当。 非常感谢您的回答和示例。它也适用于我。它帮助我理解我的错误。 它应该小心几个连接和分组:) PS当然,关系是一个1:N - 一个人类和更喜欢。这是我描述中可悲的错误。 – Juljan

相关问题