2011-11-28 14 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 count join

ので、クエリが返す必要があります:

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! 

私はクエリを実行し、WHERE A.idを行うときに、今ではreactionCountに、 "2" を返す必要があります= 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 

それはうまくいきましたが、反応数は* 2として返されます。たとえば、3つの反応がある場合、反応数= 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

reactCountは私にエラーを与えているCOUNT(R. *)でなければなりません、それは不可能ですか?問題は、他のテーブルにもLEFTが参加していることです。 – user1066101

+1

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

+0

それはうまくいっていますが、何らかの理由でカウントが2 *実際のカウント、任意の手掛かりですか?したがって、2つの反応がある場合、reactionCount = 4、3つの反応がある場合reactionCount = 6 – user1066101