获取按月分组的最近 12 个月的数据,即使为 0

Posted

技术标签:

【中文标题】获取按月分组的最近 12 个月的数据,即使为 0【英文标题】:Get last 12 months of data grouped by month even if 0 【发布时间】:2020-09-17 15:49:01 【问题描述】:

我正在尝试将过去 12 个月的约会按月分组,以便输出到图表中。以下工作正常,但如果每个月都没有结果,我需要它返回 0。

$query = "SELECT COUNT(id) as total_month FROM appointments WHERE created >= DATE(NOW()) - INTERVAL 365 DAY GROUP BY Month(created)";
    $query = $mysqli->real_escape_string($query);
      if($result = $mysqli->query($query))
        while($row = $result->fetch_array())
          
          $month_total_appointments .= $row['total_month'].',';
        
       

echo $month_total_appointments;


================================================================
    Simple table structure and example for appointments Table
    id    customer_name    created

    1     John             2020-05-01 08:00:00 <= stored as datetime
    2     Mike             2020-04-01 09:00:00
    3     Steve            2020-02-01 10:00:00

    Output would be 0,0,0,0,0,0,0,0,1,0,1,1 
======================================================

当前输出为:1,1,1

我读过一些使用月份表和 LEFT JOIN,但我尝试过的一切似乎都不起作用。有人可以帮忙吗?

【问题讨论】:

在查询中调用real_escape_string 绝对没有意义。你为什么做这个?那只会损坏数据。不要那样做。如果$prefix 里面有 SQL 注入的东西,它也救不了你。 看到像$prefix."appointments" 这样的东西通常表明您需要使您的数据库正确关联。不必有 N 个具有相同结构的表。 感谢您的反馈,但并不能真正帮助回答我的问题。前缀与具有相同结构的表没有任何关系,但我删除了它以避免对问题造成任何混淆。 你说的是我们看不到的数据。可能值得尝试SQLFiddle 之类的东西来制作一个可用的示例。 【参考方案1】:

对于不存在的行,您不会得到零。分组将符合特定条件的行组合在一起,但它不能凭空捏造它们。

这就是为什么在结果中包含分组标准的典型原因:

SELECT COUNT(id), MONTH(created) AS created_month
  FROM appointments
  WHERE created >= DATE(NOW()) - INTERVAL 365 DAY
  GROUP BY created_month

然后您可以在应用程序代码中扩展它以填充缺失值。另一种方法是您需要一个完整的列表,其中包含所有可能的日期以JOIN 反对。

请记住,MONTH() 会将 2020 年 1 月与 2021 年 1 月组合在一起。您可能希望将其拆分:

SELECT COUNT(id), YEAR(created) AS created_year, MONTH(created) AS created_month
  FROM appointments
  WHERE created >= DATE(NOW()) - INTERVAL 365 DAY
  GROUP BY created_year, created_month

【讨论】:

以上是关于获取按月分组的最近 12 个月的数据,即使为 0的主要内容,如果未能解决你的问题,请参考以下文章

按月查询获取前n个月的平均值

mysql 如何按月分组查询出当前年度每个月的短信数量(数据库中这个月要是为空的话就用0条怎么显示出来)

按月分组的运行计数以汇总销售额

SQL 按客户分组的最近 15 个月的销售额

sql中如何把具体日期转化为按月排序?

php+mysql中怎么查询最近12个月每个月的数据