【问题标题】:How to get zero count for missing dates in mysql group by clause如何在 mysql group by 子句中获取缺失日期的零计数
【发布时间】:2020-05-03 07:51:45
【问题描述】:

我有一个 mysql 表,我需要从中找出过去 30 天内每天创建的记录数。

一个简单的查询就像

select count(*) from table_name where date(created) > yyyymmdd group by date(created) order by date(created)

我不需要在这里选择日期,只需要计数。

所以我希望这里有 30 行。 但这里的问题是,如果某天没有创建记录,它就不会出现在结果中,而且我的行数会少于 30 行。

有没有其他方法可以为没有创建记录的日期打印零 (0) 计数?

当前输出:

+---------------+----------+
| date(created) | count(*) |
+---------------+----------+
| 2019-12-20    |     1504 |
| 2019-12-29    |       12 |
+---------------+----------+

预期输出:

+---------------+----------+
| date(created) | count(*) |
+---------------+----------+
| 2019-12-20    |     1504 |
| 2019-12-21    |        0 |
| 2019-12-22    |        0 |
| 2019-12-23    |        0 |
| 2019-12-24    |        0 |
| 2019-12-25    |        0 |
| 2019-12-26    |        0 |
| 2019-12-27    |        0 |
| 2019-12-28    |        0 |
| 2019-12-29    |       12 |
+---------------+----------+

【问题讨论】:

  • 添加样本数据和预期结果
  • 添加了@Jens。请检查。

标签: mysql group-by


【解决方案1】:

你可以这样使用:


SET @date_min = '2019-12-20';
SET @date_max = '2019-12-29';

SELECT
   date_generator.date as the_date,
   IFNULL(COUNT(table_name.id), 0) as count
from (
   select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max
) date_generator
left join `table_name` on DATE(created) = date_generator.date
GROUP BY date;

所以我在这里创建一个临时表 date_generator 将日期介于给定日期范围之间,并与您的主表(事务)连接。

按预期输出:

+---------------+----------+
| the_date      | count    |
+---------------+----------+
| 2019-12-20    |     1504 |
| 2019-12-21    |        0 |
| 2019-12-22    |        0 |
| 2019-12-23    |        0 |
| 2019-12-24    |        0 |
| 2019-12-25    |        0 |
| 2019-12-26    |        0 |
| 2019-12-27    |        0 |
| 2019-12-28    |        0 |
| 2019-12-29    |       12 |
+---------------+----------+

【讨论】:

  • 您好@Ronak,我如何通过用户名获得相同的结果。表格中有一个用户名列,因此希望为特定用户获得相同的结果,在此先感谢。
  • @Speego 能否提供示例输入和输出以便更好地理解?
【解决方案2】:

测试:

WITH RECURSIVE
cte AS ( SELECT @yyyymmdd + INTERVAL 1 DAY dateCreated 
         UNION ALL
         SELECT dateCreated + INTERVAL 1 DAY
         FROM cte
         WHERE dateCreated < ( SELECT MAX(DATE(created))
                               FROM table_name ) )
SELECT COUNT(table_name.created) 
FROM cte
JOIN table_name ON DATE(table_name.created) = cte.dateCreated 
GROUP BY cte.dateCreated 
ORDER BY cte.dateCreated 

@yyyymmdd 是一个变量或占位符,其中必须指定查询条件 (where date(created) &gt; yyyymmdd) 中的值。

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2021-04-09
    • 1970-01-01
    • 2015-06-28
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多