【问题标题】:Single query to get count of individual of past 7 days单个查询以获取过去 7 天的个人计数
【发布时间】:2025-12-07 20:50:01
【问题描述】:

我确实知道以下条件会返回过去 7 天的总数

SELECT count(id) FROM registration 
WHERE createdDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()

我是否可以通过单个查询来获取过去 7 天的返回结果,该数组包含每天的 7 个结果?

例如:

day 1 - 10
day 2 - 5
day 3 - 9
..
..
..

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    这将为您提供日期和计数。

    SELECT DATE(createdDate),COUNT(id)
    FROM registration
    WHERE createdDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()
    GROUP BY DATE(createdDate)
    

    或者,为了提供更接近您的示例的结果,您可以使用:

    SELECT CONCAT("Day ",DATEDIFF(NOW(), createdDate)) AS day,COUNT(id)
    FROM registration
    WHERE createdDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()
    GROUP BY DATE(createdDate)
    

    【讨论】:

    • 哇,太好了,如果在某一天没有注册,你认为有可能显示 0 计数吗?第 1 天 - 第 4 天 第 2 - 3 天 第 3 - 0 天 第 4 - 1 天 第 5 - 0 天 类似
    • 我不确定是否有办法通过上述查询显示 0 表示没有注册。您可以在 PHP 端执行此操作,也可以使用 @Barmar 的答案。
    【解决方案2】:

    添加 group-by 子句:

    SELECT count(id), DATE(createdDate)
    FROM registration
    WHERE createdDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()
    GROUP BY DATE(createdDate)
    

    【讨论】:

      【解决方案3】:
      select 8 - n day, count(id)
      from registration
      join (select 1 n union select 2 union select 3 union select 4 union select 5 union select 6 union select 7) x
      on createdDate between date_sub(curdate(), interval n day) and date_sub(curdate(), interval n-1 day)
      group by day
      order by day
      

      【讨论】: