2013-05-19 111 views
8

我有一組月度職位。現在我需要一個數組,其中包含每個月發佈的帖子的總記錄。我在MySql查詢下面試過,它的工作正常,但我在沒有記錄的月份期待0(零)。這裏它不返回0.如果沒有找到記錄,MySql count()返回0

我讀了COUNT()不會返回'0',那麼我如何實現這個?

我嘗試了IFNULL()和COALESCE(),但仍得到相同的結果。請幫助這個查詢。謝謝你......

SELECT 
count(id) as totalRec 
FROM ('post') 
WHERE year(date) = '2013' 
AND monthname(date) IN ('January', 'February', 'March') 
GROUP BY year(date)-month(date) 
ORDER BY 'date' ASC 

得到了結果:

+----------+ 
| totalRec | 
+----------+ 
|  7 | 
|  9 | 
+----------+ 

預期結果(凡有一月沒有職位):

+----------+ 
| totalRec | 
+----------+ 
|  0 | 
|  7 | 
|  9 | 
+----------+ 

樣本數據:

+----+---------------------+ 
| id | date    | 
+----+---------------------+ 
| 24 | 2012-12-16 16:29:56 | 
| 1 | 2013-02-25 14:57:09 | 
| 2 | 2013-02-25 14:59:37 | 
| 4 | 2013-02-25 15:12:44 | 
| 5 | 2013-02-25 15:14:18 | 
| 7 | 2013-02-26 11:31:31 | 
| 8 | 2013-02-26 11:31:59 | 
| 10 | 2013-02-26 11:34:47 | 
| 14 | 2013-03-04 04:39:02 | 
| 15 | 2013-03-04 05:44:44 | 
| 16 | 2013-03-04 05:48:29 | 
| 19 | 2013-03-07 15:22:34 | 
| 20 | 2013-03-15 12:24:43 | 
| 21 | 2013-03-16 16:27:43 | 
| 22 | 2013-03-16 16:29:28 | 
| 23 | 2013-03-16 16:29:56 | 
| 11 | 2013-03-17 11:35:12 | 
+----+---------------------+ 
+1

你可以給樣本記錄,我們可以一起玩? –

+0

你GROUP BY看上去不正確 –

+0

@JW웃我已經編輯我的問題與樣本數據.. – sravis

回答

15

有用於January月份沒有記錄,這就是爲什麼你越來越沒有結果。一種可行的解決方案是加入一個子查詢,其中包含您希望顯示在列表中的月份列表。

SELECT count(b.id) as totalRec 
FROM (
      SELECT 'January' mnth 
      UNION ALL 
      SELECT 'February' mnth 
      UNION ALL 
      SELECT 'March' mnth 
     ) a 
     LEFT JOIN post b 
      ON a.mnth = DATE_FORMAT(b.date, '%M') AND 
       year(b.date) = '2013' AND 
       DATE_FORMAT(b.date, '%M') IN ('January', 'February', 'March') 
GROUP BY year(b.date)-month(b.date) 
ORDER BY b.date ASC 

輸出

╔══════════╗ 
║ TOTALREC ║ 
╠══════════╣ 
║  0 ║ 
║  7 ║ 
║  9 ║ 
╚══════════╝ 
+0

不錯的一個。我也正在做一個sql小提琴。但你擊敗了我 - 像往常一樣:) +1 – luksch

+0

哇,非常感謝。我試着從過去的1小時裏得到這個結果,最後你節省了我的時間。非常感謝你。 – sravis

+0

@JW我在你的JSfiddle例子的選擇列表中添加了April Month,所以結果應該是[0,7,9,0],但是它顯示[0,7,9]。你能看到它嗎? http://www.sqlfiddle.com/#!2/e0a6e/15 – sravis

3

您是否嘗試過IFNULL()正確的方法?也許嘗試IFNULL(Count(id), 0)SELECT子句加入。

3

COALESCE是你可以使用的東西,如果你有日期的表和左加入了反對。它從左到右返回第一個非null值。 你的小組在我看來有點堅果,我已經調整了它。

SELECT 
COALESCE(count(id),0) as totalRec 
FROM ('post') 
LEFT JOIN dates 
ON dates.date = post.date 
WHERE year(date) = '2013' 
AND monthname(date) IN ('January', 'February', 'March') 
GROUP BY month(date), year(date) 
ORDER BY 'date' ASC 

哪裏日期表..

DATE 
2013-01-01 
2013-01-02 
2013-01-03 
etc.... 

在這裏看到:http://easywebapps.blogspot.co.uk/2011/07/mysql-how-to-create-calendar-table.html

+0

我想你的查詢,我仍然得到同樣的結果 – sravis

+0

對不起,我錯過了日期表創建位,這就是重要的 –

1

如果結果集在這段時間內沒有任何職位,你不會得到任何結果來算,因此爲什麼不顯示。

您將需要要麼加入到具有所有的年月另一個表或數據編程填寫返回結果時。我想不出另一種方式來做到這一點,但也許這是可能的。

另外,正如其他人所說,用逗號分隔組。

0

我想你只需要這樣的查詢

SELECT COALESCE(COUNT(id),0) AS totid FROM table 

VB例子

Set count=Con.Execute("SELECT COALESCE(COUNT(id),0) AS totid FROM table") 

然後寫

<%=count("totid")%> 
相關問題