2011-05-13 120 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;