2016-06-21 42 views
1

我擁有簡單的雜誌,並且擁有包含帖子,評論,類別等的表格。列出單個類別時,我希望獲得評論總數每個帖子在一個列表中,但這個數字是錯誤的,它讓我瘋狂。請注意,單個帖子可以分爲多個類別。如何正確計算table2中與table1中的項目相關的行,其中的子句與table1無關

這裏有

posts 
id | title | categoryid | content | published 
--------------------------------------------- 

comments 
id | postid | comment 
--------------------- 

category_rel 
postid | categoryid 
------------------- 

categories 
id | category 
------------- 

我用下面的SQL簡單的表結構(簡化爲這個例子):

SELECT posts.*, categories.id AS categoryid, 
    categories.category AS categorytitle, 
    COUNT(comments.postid) AS CNT 
FROM posts 
LEFT JOIN comments ON posts.id = comments.postid 
INNER JOIN category_rel ON posts.id = category_rel.postid 
INNER JOIN categories ON category_rel.categoryid = categories.id 
WHERE posts.published=1 
GROUP BY posts.id; 

這種說法是給我的錯誤的結果,sometning像它的累積類別的數量帖子是成員並且與實際的評論數量相乘。如果我刪除SQL類別一部分(這是不好的,我需要的類ID和名稱),我收到正確的價值觀:

SELECT posts.*, COUNT(comments.postid) AS CNT 
FROM posts 
LEFT JOIN comments ON posts.id = comments.postid 
WHERE posts.published=1 
GROUP BY posts.id; 

更具體: 一個職位有1條評論,這是7個成員類別。價值CNT將去7,而不是1.

任何想法如何改變第一個SQL來獲得正確的值?

+0

GROUP BY posts.id =是否正確?可能你需要GROUP BY comments.postid? –

+0

不可以。按comments.postid分組時不會爲每個帖子獲得正確的值。或者可能會得到所有相同的值 –

回答

1

您要計算每個帖子的評論數 - 而不是每個類別。因此,實現這一目標的一個方法是先做計數(子查詢中的MySQL有沒有CTE爲止),然後加入結果納入分類表:

SELECT countpost.*, categories.id AS categoryid, 
    categories.category AS categorytitle 
    FROM 
    -- subselect post and comment count 
    (
    SELECT posts.*, count(comments.postid) as CNT FROM posts 
    LEFT JOIN comments ON posts.id = comments.postid 
     WHERE posts.published = 1 
     GROUP BY posts.id 
) as countpost 
    -- join category table 
INNER JOIN category_rel ON countpost.id = category_rel.postid 
INNER JOIN categories ON category_rel.categoryid = categories.id ; 

看到這個小提琴:http://sqlfiddle.com/#!9/f9c6f/1

+0

這是非常正確的。謝啦! –

相關問題