2011-05-13 107 views
8

我正在編寫一個查詢以返回在特定時間段內每天寫入的博客帖子數。當某一天沒有博客記錄時,我的問題就出現了。用我的查詢,那一天的結果就完全被忽略了。MySQL GROUP BY日期 - 如何在沒有行時返回結果

這裏是我的查詢:

SELECT DATE(`posted`), COUNT(`id`) 
    FROM `blogs` WHERE `status` = 'active' 
    && `posted` BETWEEN `2011-01-01` AND `2011-05-01` 
    GROUP BY DATE(`posted`) 

它返回一個類似的東西:它缺少2011-01-03,因爲它沒有任何職位

count | date 
_________________ 
2  | 2011-01-01 
5  | 2011-01-02 
1  | 2011-01-04 

通知。

如何讓它顯示那些有0個帖子的日子?

回答

6

你需要有一個包含你要查詢在所有日期的表格,並做線沿線的東西...

SELECT DATE(D.`thedate`), COUNT(`id`) 
FROM `datetable` D 
LEFT JOIN `blogs` B 
ON B.`posted` = D.`thedate` 
WHERE `status` = 'active'  
&& D.`thedate` BETWEEN `2011-01-01` AND `2011-05-01`  
GROUP BY DATE(D.`thedate`) 
+0

我該如何處理這種動態的方式?我想知道最新的統計數據,並希望能夠隨機選擇日期範圍。 – johnnietheblack 2011-05-13 06:53:08

+0

@johnnietheblack - 確保您的日期表包含足夠大的範圍以覆蓋所有可能的查詢 - 因爲如果日期表包含從1900到2100的所有日期(例如 - a),則仍在過濾WHERE子句中的日期一點點矯枉過正)它真的無所謂 - 只要確保你索引這張表的日期列! – 2011-05-13 06:55:03

0

創建包含日期表(取自http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#95):

-- Create a dummy view with 3 rows 
create or replace view v3 as select 1 n union all select 1 union all select 1; 
-- create a second dummy view with 10 rows 
-- By making joins with this view, you can create 100, 1000, ... rows 
create or replace view v as select 1 n from v3 a, v3 b union all select 1; 
-- counter 
set @n = 0; 
-- create date table 
drop table if exists datetable; 
create table datetable(thedate date primary key); 
-- populate from start date 
insert into datetable select cast('1970-1-1' + interval @n:[email protected]+1 day as date) as thedate 
from v a, v b, v c, v d, v e, v;