【问题标题】:How to add day gaps to mysql query without calendar table如何在没有日历表的情况下向 mysql 查询添加天间隔
【发布时间】:2023-04-01 07:49:01
【问题描述】:

我想收到过去 10 天中每天按日期分组的所有请求的总和。 如果一天没有请求,则对应的日期应该出现 sumrequests = 0。

我目前的查询(今天是日期2020-01-10):

SELECT
  count( 0 ) AS sumrequests,
  cast( requests.created_at AS date ) AS created 
FROM
  requests 
WHERE
  (
    requests.created_at
    BETWEEN ( curdate() - INTERVAL 10 DAY ) 
    AND ( curdate() + INTERVAL 1 DAY )) 
GROUP BY
  cast(requests.created_at AS date)

然后我收到以下列表:

sumrequests | created
--------------------------
3           | 2020-01-05
100         | 2020-01-08

但它应该回馈:

sumrequests | created
--------------------------
0           | 2020-01-01
0           | 2020-01-02
0           | 2020-01-03
0           | 2020-01-04
3           | 2020-01-05
0           | 2020-01-06
0           | 2020-01-07
100         | 2020-01-08
0           | 2020-01-09
0           | 2020-01-10

如果没有额外的日历表,我怎样才能得到这个。

感谢您的帮助!

【问题讨论】:

标签: mysql sql


【解决方案1】:

对于仅仅 10 天的数据,您可以简单地列举数字;使用这个派生数字表,可以生成对应的日期范围,left join它与表并聚合。

SELECT
    COALESCE(count(r.created_at), 0) AS sumrequests,
    CURDATE() - INTERVAL (n.i) DAY AS created 
FROM (
    select 0 i union all select 1 union all select 2 union all select 3 
    union all select 4 union all select 5 union all select 6 union all select 7 
    union all select 8 union all select 9 union all select 10
) n
LEFT JOIN requests r
    ON  r.created_at >= CURDATE() - INTERVAL n.i DAY 
    AND r.created_at <  CURDATE() - INTERVAL (n.i - 1) DAY  
GROUP BY n.i
ORDER BY n.i DESC

旁注:

  • 通常您希望避免在连接或过滤条件中应用函数,因为它会阻止使用索引;我修改了你的过滤器不使用CAST()

  • 由于我们离开加入,我们需要计算来自请求表的内容,因此我们使用COUNT(r.created_at) 而不是COUNT(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多