2011-11-28 40 views
0
SELECT A.id as ActivityId, A.description, T.id, T.title, COUNT(R.*) as reactionCount 
FROM activities 
LEFT JOIN activitiesReactions as R ON R.activityId = A.id 
LEFT JOIN activitiesTags as T ON A.tagId = T.id 

所以基本上我需要一个查询,将得到所有的活动,并在同一时间无法获得该活动的反应,但得到的反应,这是在所谓的activitiesReactions另一个表中找到的计数,我该如何做到这一点(请参阅上述查询,我​​想到了)。MySQL的计数加入

所以查询应该返回:

array('activityId' => 3, 'description' => 'doing work', 'reactionCount' => 2) 

一个例子行:

Activities table: 
id | description 
3 doing work 
4 checking mail 

ActivitiesReactions table: 
id | activityId | message 
1   3 you never do anywork, so that must be bullshit. 
2   3 yes I do alot of work! 

所以现在它应该返回, “2” reactionCount当我执行查询并做WHERE A.id = 3


SELECT A.id as ActivityId, A.description, COUNT(R.activityId) AS reactionCount 
FROM activities 
LEFT JOIN activitiesReactions as R 
ON R.activityId = A.id 
GROUP BY A.id 

这确实奏效,但reactionCount返回为* 2,例如,如果有3个反应,reactionCount = 6,2个反应的reactionCount = 4等。

+0

您的示例没有任何意义......你怎么来了'2'作为结果?另外,你的数组与你显示的行不匹配 – knittl

+0

哈哈你说得对,现在已经修复了 – user1066101

回答

5

您的查询只需要一个group by子句使其工作,例如。

SELECT A.id as ActivityId, A.description, COUNT(R.*) 
FROM activities 
    LEFT JOIN activitiesReactions as R ON R.activityId = A.id 
GROUP BY A.id, A.description; 
+2

你不需要MySQL中的'A.description'。你只需要:'GROUP BY A.id' –

2

如果要计算每个活动反应的数量,你必须按activity.id加入两个表后:

SELECT A.id as ActivityId, A.description, COUNT(*) AS reactionCount 
FROM activities 
LEFT JOIN activitiesReactions as R 
ON R.activityId = A.id 
GROUP BY A.id 
+0

Oke the reactionCount应该只是COUNT(R. *),这给了我一个错误,是不可能的?问题是我还是左边加入其他桌子。 (修正我的例子) – user1066101

+1

使用:'COUNT(R.activityId)' –

+0

奥克工作,但由于某种原因计数是2 *实际计数,任何线索?所以如果有2个反应,那么reactionCount = 4,如果有3个反应,那么reactionCount = 6 – user1066101