2013-11-21 251 views
1

我有一個查詢,它可以計算每個線程中的帖子數。現在我遇到了一些問題。如果我的新線程沒有帖子ID,它不會顯示線程。我可以知道我該如何解決它? 這裏是我的查詢mysql語句中的count語句select

SELECT t.title, m.userName, COUNT(p.postID) AS Expr1, t.threadID 
FROM post p ,thread t , person m WHERE m.PersonID = t.PersonID 
AND t.threadID = p.threadID AND t.categories = "Announcement" 
GROUP BY t.title, m.PersonName 

我希望我會得到的結果類似

------------------------------------------------- 
| Title   | Author |   Replies| 
------------------------------------------------- 
| Hello   | haah |  7   | 
------------------------------------------------ 
| Bye Bye  | lee  |  8   | 
------------------------------------------------ 

的答覆是基於線程的答覆。

+0

嘗試使用'LEFT JOIN'來做這件事 –

回答

1

使用LEFT JOIN代替,像這樣:

SELECT 
    t.title, m.userName, t.threadID, 
    COUNT(COALESCE(p.postID, 0)) AS Expr1 
FROM 
(
    SELECT * 
    FROM thread 
    WHERE categories = 'Announcement' 
) AS t 
LEFT JOIN post p ON t.threadID = p.threadID 
LEFT JOIN person m ON m.PersonID = t.PersonID 
GROUP BY t.title, m.PersonName, t.threadID ; 

那麼如果一個線程沒有任何職位,將包括在結果與COUNT = 0

+0

它顯示出數據庫中的所有內容...不僅僅基於公告 – user2769165

+0

@ user2769165 - 將它移到where子句,請參閱我的編輯。 –

+0

已經正確顯示,但現在計數不準確。沒有帖子顯示的線程1.但它應該顯示0 – user2769165

0
SELECT t.title, m.userName, COUNT(p.postID) AS Expr1, t.threadID 
FROM post p left join thread t on t.threadID = p.threadID 
left join person m on m.PersonID = t.PersonID 
Where t.categories = "Announcement" 
GROUP BY t.title, m.PersonName 
1

設置第一步是用JOIN語法重寫你的查詢(你需要需要來學習這個)

SELECT t.title 
    , m.userName 
    , COUNT(p.postID) As Expr1 
    , t.threadID 
FROM thread As t 
INNER 
    JOIN post As p 
    ON p.threadID = t.threadID 
INNER 
    JOIN person As m 
    ON m.PersonID = t.PersonID 
WHERE t.categories = "Announcement" 
GROUP 
    BY t.title 
    , m.PersonName 

這使用INNER加入。此連接類型表示每條記錄必須在連接的任一側都有匹配。

爲了得到你想要的結果,你需要一個OUTER連接。這將返回連接一側的所有記錄,並在可能的情況下匹配外部表中的記錄。

SELECT t.title 
    , m.userName 
    , COUNT(p.postID) As Expr1 
    , t.threadID 
FROM thread As t 
LEFT 
    JOIN post As p 
    ON p.threadID = t.threadID 
INNER 
    JOIN person As m 
    ON m.PersonID = t.PersonID 
WHERE t.categories = "Announcement" 
GROUP 
    BY t.title 
    , m.PersonName 

請注意第二個查詢中非常微妙的變化。我已將一個連接更改爲左連接。在連接中的第一個(左)表中,將需要所有記錄,並且在可能的情況下匹配post

+0

謝謝..它的工作:D – user2769165

+0

@ user2769165你明白它爲什麼有效嗎? – gvee