2

我想从一个时间段(比如一周)中恢复注册的数量,这并不难,但我想知道在 MySQL 中是否有可能在没有的天返回零注册。

一个例子: 数据:

ID_Profile 数据创建
1 2009-02-25 16:45:58
2 2009-02-25 16:45:58
3 2009-02-25 16:45:58
4 2009-02-26 10:23:39
5 2009-02-27 15:07:56
6 2009-03-05 11:57:30

SQL:

    选择
        DAY(datCreate) 作为注册日期,
    COUNT(ID_Profile) 作为 NumberOfRegistrations
    FROM tbl_profile
    WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY)
    GROUP BY 注册日期
    按 datCreate ASC 排序;

在这种情况下,结果将是:

注册日期注册人数
25 3
26 1
27 1
5 1

显然,我在这之间错过了几天。目前我正在我的 php 代码中解决这个问题,但我想知道 MySQL 是否有任何方法可以为丢失的天数/行自动返回 0。这将是期望的结果:

注册日期注册人数
25 3
26 1
27 1
28 0
1 0
2 0
3 0
4 0
5 1

这样我们就可以使用 MySQL 来解决任何关于一个月天数的问题,而不是依靠 php 代码来计算每个月有多少天,因为 MySQL 内置了这个功能。

提前致谢

4

2 回答 2

4

不,但一种解决方法是创建一个带有日期主键的单列表,并预加载每天的日期。从最早的起点一直到遥远的未来,您都会有日期。

现在,您可以针对它 LEFT JOIN 您的统计数据 - 然后您将在没有数据的情况下获得空值。如果您真的想要零而不是空值,请使用IFNULL(colname, 0)

于 2009-03-05T13:33:20.040 回答
1

感谢 Paul Dixon,我找到了解决方案。任何对我如何解决此问题感兴趣的人请继续阅读:

首先创建一个存储过程,我在某个地方找到了一个包含今年所有日期的表格。

CREATE 表日历(dt 日期不为空);

CREATE PROCEDURE sp_calendar(IN start_date DATE, IN end_date DATE, OUT result_text TEXT)
  开始
    SET @begin = '插入日历(dt)值';
    SET @date = start_date;
    SET @max = SUBDATE(end_date, INTERVAL 1 DAY);
    SET @temp = '';
    重复
      SET @temp = concat(@temp, '(''', @date, '''), ');
      SET @date = 添加(@date,间隔 1 天);
      直到@date > @max
    结束重复;
    SET @temp = concat(@temp, '(''', @date, ''')');
    SET result_text = concat(@begin, @temp);
  结尾


   调用 sp_calendar('2009-01-01', '2010-01-01', @z);

   选择@z;

然后更改查询以添加左连接:

选择
    DAY(dt) 作为注册日期,
    COUNT(ID_Profile) 作为 NumberOfRegistrations
从日历
左连接
    tbl_profile ON calendar.dt = tbl_profile.datCreate
WHERE DATE_SUB(CURDATE(),INTERVAL 6 DAY) 和 CURDATE() 之间的 dt
GROUP BY 注册日期
由 dt ASC 订购

我们完成了。

感谢大家的快速回复和解决方案。

于 2009-03-05T14:46:04.967 回答