2012-04-04 82 views
4

我正在運行此查詢,它從一個表中選擇幾個字段並從其他表中返回計數。SQL - 計數不返回零

我的問題:如果我的計數器字段之一計數爲零,它不會返回數字0,它只是空白 - 這是我想嘗試和解決的。

SELECT mem.member_id, mem.screen_name, mem.firstname, mem.lastname, mem.country_code, 
mem.joined, rep.rep as reputation, com.cnt as comments FROM members AS mem 
LEFT OUTER JOIN (
    SELECT member_id, SUM(awarded_what) as rep 
    FROM members_reputation 
    GROUP BY member_id) rep 
    ON mem.member_id = rep.member_id 
LEFT OUTER JOIN (
    SELECT member_id, COUNT(comment_id) as cnt 
    FROM blog_comments 
    GROUP BY comment_id) com 
    ON mem.member_id = com.member_id 
GROUP BY mem.member_id 
ORDER BY mem.joined DESC 

我想什麼是這樣的:

Screen Name  | Comments 
-----------------|-------------------- 
marty76   | 0 
jonnyBoy12  | 0 
adamApple  | 12 

但是,我得到這樣的事情,而不是!

Screen Name  | Comments 
-----------------|-------------------- 
marty76   | 
jonnyBoy12  | 
adamApple  | 12 

使用我的服務器端語言,通過用零替換空值可以很容易地解決這個問題。但是我想要直接從SQL獲得零,所以我可以通過計數來排序。

任何建議將是奇妙的。

+0

不需要派生表 - 修正連接,解決問題。 – 2012-04-04 14:15:24

+0

@OMGPonies:我從這個查詢中刪除了5個其他的LEFT OUTER JOIN計數,所以它對我的問題更容易理解。你的意思是你說的是什麼?我用其他方法測試派生表,並且迄今爲止贏得了性能。 – TheCarver 2012-04-04 14:30:51

回答

4

嘗試IFNULL功能

SELECT mem.member_id, mem.screen_name, mem.firstname, mem.lastname, mem.country_code, 
mem.joined, rep.rep as reputation, IFNULL(com.cnt,0) as comments FROM members AS mem 
LEFT OUTER JOIN ( 
    SELECT member_id, SUM(awarded_what) as rep 
    FROM members_reputation 
    GROUP BY member_id) rep 
    ON mem.member_id = rep.member_id 
LEFT OUTER JOIN ( 
    SELECT member_id, COUNT(comment_id) as cnt 
    FROM blog_comments 
    GROUP BY comment_id) com 
    ON mem.member_id = com.member_id 
GROUP BY mem.member_id 
ORDER BY mem.joined DESC 
+0

感謝羅蘭多,這是一個很大的幫助。 – TheCarver 2012-04-04 14:27:28

+0

該答案實際上幫助我處理其他查詢。我現在知道我可以這樣做:IFNULL(列,「N/A」),它允許我在幾個地方刪除一些服務器端代碼。太好了! – TheCarver 2012-04-04 14:48:33

-2

你能使用ISNULL?

ISNULL(com.cnt, 0) as comments 
+0

'ISNULL'用於MsSQL服務器 – sll 2012-04-04 14:17:20

1

變化:

COUNT(comment_id) 

IFNULL(COUNT(comment_id), 0) 
1

其他的方式可以是:

coalesce(count(comment_id),0) 
1

我想這應該給你你想要得到的結果它比你的查詢簡單得多:

SELECT mem.member_id, mem.screen_name, mem.firstname, mem.lastname, 
    mem.country_code, mem.joined, 
    SUM(awarded_what) reputation, COUNT(comment_id) comments 
FROM members mem 
LEFT JOIN members_reputation rep ON mem.member_id = rep.member_id 
LEFT JOIN blog_comments com ON mem.member_id = com.member_id 
GROUP BY mem.member_id 
ORDER BY mem.joined DESC 
+1

這不如我的派生表方法。在我真正的查詢中,我有來自多個表的7個左外連接計數。對10個DB記錄進行測試,我的查詢運行時間爲0ms,查詢運行時間爲1ms - 超過1m記錄,這是相當大的性能提升。謝謝你:) – TheCarver 2012-04-04 14:38:59

+0

再次測試10分貝記錄是根本沒有測試。每張桌上至少有10,000條記錄進行多次測試。 1毫秒的差異甚至可能是當時生成上下文切換的簡單StackOverflow網頁刷新。這不能慢,因爲它正在做的工作少於您的查詢 – 2012-04-04 14:49:55

+0

我不確定您的意思是1毫秒差異是一個StackOverflow網頁刷新。我正在MySQL Workbench中對數據庫測試兩個查詢,派生表贏了。它與一個StackOverflow網站刷新無關!當我說10條記錄測試時,我的意思是10條記錄限制在我的查詢中,因爲這是我在我的應用程序中打印的所有內容。它有1000多條評論。 – TheCarver 2012-04-04 15:04:20