2011-11-28 68 views
0

表結構:MySQL的計數加入雙結果

活動 ID,名稱,標籤識別

activitiesTags ID,標題

activitiesReactions ID,activityId,消息

的現在查詢:

SELECT A.id as activityId, A.name, A.tagId, T.id, T.title, COUNT(R.id) 
FROM activities A 
LEFT JOIN activitiesTags T 
ON A.tagId = T.id 
LEFT JOIN activitiesReactions R 
ON R.activityId = A.id 
GROUP BY A.id 
ORDER BY A.id DESC 
LIMIT ? 

問題是我得到了一個reactionCount,但它遠非如此,似乎當一個活動有反應時,它將(*)實際反應的數量乘以兩。

有誰知道問題出在哪裏?也許GROUP BY之後的ORDER BY?

感謝

+1

這是因爲你也加入了標籤 – munissor

+0

我明白了,所以我應該把它分成2個查詢嗎?只需在另一個查詢中加入標籤?還是工會? – user1066101

回答

1

@knittl

一些修改您的查詢:

SELECT a.* , group_concat(T.title) 
FROM ( 
    SELECT A.id as activityId, A.name, A.tagId, T.id, T.title, COUNT(R.id) 
    FROM activities A 
    LEFT JOIN activitiesReactions R 
    ON R.activityId = A.id 
    GROUP BY A.id 
    ORDER BY A.id DESC 
    LIMIT ? 
) a 
LEFT JOIN activitiesTags T 
ON a.tagId = T.id 

group_concat將顯示所有標籤與分隔符( 「」)。您的查詢將只顯示第一個。

+0

沒有多個標籤,只有多個反應(但我只需要反應的計數而不是實際的反應數據) – user1066101

+0

如果我瞭解最近的評論,每個活動只會有一個標籤。此外,我的查詢將獲得所有標籤,但每行只有一個 – knittl

+0

這個工作,但現在下一步:usersFriends,是的,現在我扔在另一個表中,我需要一個證書用戶的所有朋友的活動所以我有另一個表:usersFriends(id,userId,friendUserId)。在我做之前:SELECT A.id etc ... FROM usersFriends UF LEFT JOIN activitiesTags WHERE UF.userId =?那我該怎麼做? – user1066101

2

您正在其上進行分組activities.id(或activitiesReaction.activityId,你把它取的方式)。通過加入您的標籤表格,您將獲得與給定活動相匹配的每個標籤的新行。您的計數不會加倍,但會乘以每項活動的標籤數量。

你想使用子查詢的標籤添加到您以前的結果集:

SELECT * 
FROM (
    SELECT A.id as activityId, A.name, A.tagId, T.id, T.title, COUNT(*) 
    FROM activities A 
    LEFT JOIN activitiesReactions R 
    ON R.activityId = A.id 
    GROUP BY A.id 
    ORDER BY A.id DESC 
    LIMIT ? 
) a 
LEFT JOIN activitiesTags T 
ON a.tagId = T.id 

這會給你正確的COUNT,但它仍然會每個活動返回多行。

+0

我可以通過使用聯合來修復它,否則我必須在查詢之後放置一個foreach循環,並且執行所有活動(可能類似於200),因此對於每個活動,我將不得不再次查詢數據庫,這將是一個漂亮的業績損失很大嗎? – user1066101

+0

@ user1066101:您試圖完成的目標是什麼?一個可能性是使用子查詢,給我第二個 – knittl

+0

我想要一個活動列表,每個活動可以有一個標籤(不需要這麼左連接,只有一個),每個活動都可以有反應(不需要,可以是多個每個活動的反應),但我只想獲得計數,因爲稍後用戶將看到活動COUNT,並且如果他們單擊活動本身,它將加載ACTUAL反應(因此它不會立即加載所有內容+可以更新它與json實時)。 – user1066101