2011-07-25 135 views
4

雖然我研究了這個主題,並且遇到了一些解決方案,例如使用JOIN LEFT或子查詢,但我仍然無法得到我想要的結果,因爲我在mySQL中不強壯。我更多的是一個網頁設計師,試圖使用簡單的PHP到我的網站更好的一個學校項目。如果沒有找到記錄,MySQL計數不會返回0

我想創建一個類似於博客的web應用程序。我想統計一篇文章有​​多少評論,並顯示我的用戶可以看到的數量,但是如果沒有對該行的評論,我的查詢將不會返回任何內容。

這是我的查詢下面:

SELECT post.post_id, COUNT(comment) 
FROM `comment`, post 
WHERE `comment`.post_id = post.post_id 
GROUP BY post.post_id 

結果:

Record | post_id | COUNT(comment) 
1  | 12  | 2 
2  | 13  | 1 
3  | 15  | 1 
4  | 16  | 1 

正如你所看到的,post_id 14有沒有意見,因此我的查詢返回任何內容。我必須做什麼來使我的結果看起來像這樣?

Record | post_id | COUNT(comment) 
1  | 12  | 2 
2  | 13  | 1 
3  | 14  | 0 
4  | 15  | 1 
5  | 16  | 1 

而且,這將是很好,你們給我引用或鏈接瞭解解決方案背後的概念,我想了解更多關於PHP :)

回答

7

所以實際上當你這樣做(這是你做了什麼,重新爲JOIN):

SELECT post.post_id, COUNT(comment) 
FROM `comment` 
INNER JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id; 

你收集只能夠註釋至少一個基準柱行。

如果你改變了JOIN類型爲LEFT JOIN,這種方式:

SELECT post.post_id, COUNT(comment) 
FROM `comment` 
LEFT JOIN post ON `comment`.post_id = post.post_id 
GROUP BY post.post_id; 

然後從交行都在那裏,和NULL值將插入的意見欄,如果與沒有評論此行存在(這是一個左連接)。因此,如果comment是來自表註釋的列,它將在每個行的post表中存在,但是具有NULL值,在post_id列上的group by之後,與該post相關的註釋的子集僅包含1個NULL值,count應該返回0

select count(NULL); 

返回0

現在你可以使用子查詢,但是這是一個非常糟糕的主意,子查詢通常做的,而不是左連接,通常這是一個錯誤,有時並非如此,但這往往是一個錯誤。當您執行左連接索引時,會使用索引來比較兩個表(ON子句)的鍵值並生成行的最終'臨時'結果,從兩個表中混合值(然後或可能在同一時間,您的查詢的其他部分的過濾器被應用)。在使用子查詢時,對於第一個表的每一行,運行一個新查詢以從第二個表中獲取結果(並非總是如此,但這是另一個問題),數據庫引擎的成本更高。

1

查詢職位表,並做了子查詢計數的評論查詢。

SELECT post.post_id, (SELECT COUNT(comment) FROM `comment` WHERE `comment`.post_id = post.post_id) as comments FROM post 

這可能會變得很慢,有很多或行,所以當你到達那個點時,用尋呼機添加一個限制。

相關問題