获取按月分组的最近 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的主要内容,如果未能解决你的问题,请参考以下文章