【问题标题】:MySQL GROUP BY date - how to return results when no rowsMySQL GROUP BY date - 没有行时如何返回结果
【发布时间】:2011-05-13 06:42:12
【问题描述】:

我正在编写一个查询来返回特定时间段内每天写的博客文章数。当某一天没有博客记录时,我的问题就出现了。通过我的查询,那天的结果完全被跳过了。

这是我的查询:

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

它返回类似于:

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

请注意它缺少 2011-01-03,因为它没有任何帖子。

如何让它以 0 个帖子显示那些日子?

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    您需要有一个表,其中包含您要查询的所有日期,并按照...的方式执行一些操作

    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`)
    

    【讨论】:

    • 我将如何以动态方式处理这个问题?我想要最新的统计数据,并且希望能够随机选择日期范围。
    • @johnnietheblack - 只需确保您的日期表包含足够大的范围以涵盖所有可能的查询 - 因为您仍在过滤 WHERE 子句中的日期,如果日期表包含 1900 年以来的所有日期到 2100(例如 - 有点矫枉过正)真的没关系 - 只要确保你索引这个表上的日期列!
    【解决方案2】:

    创建包含日期的表(取自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:=@n+1 day as date) as thedate 
    from v a, v b, v c, v d, v e, v;  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2021-02-22
      • 2013-02-14
      • 1970-01-01
      相关资源
      最近更新 更多