如何使用 0 值的 MySQL 获得最近 30 天的结果?

Posted

技术标签:

【中文标题】如何使用 0 值的 MySQL 获得最近 30 天的结果?【英文标题】:How to get the last 30 days results with MySQL with 0 value too? 【发布时间】:2021-07-12 04:26:10 【问题描述】:

我正在尝试获取过去 30 天的所有结果,当 count 为 0 时得到 0。

我的查询是:

SELECT substring(mc.publication_date, 1, 10) AS title, count(mc.id) AS quantity 
FROM mymyv_cards mc 
WHERE mc.publicated = 1 AND STR_TO_DATE(substring(mc.publication_date, 1, 10), "%d-%m-%Y") BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()
GROUP BY substring(mc.publication_date, 1, 10)

我明白了:

但我希望结果是这样的:

06-04-2021 --> 1

07-04-2021 --> 2

08-04-2021 --> 0

09-04-2021 --> 0

10-04-2021 --> 0

......................等等等等

我不知道该怎么做,你能帮我吗?

【问题讨论】:

你的 mysql 是什么版本?如果是 8,则可以使用 CTE。 见meta.***.com/questions/333952/… 但考虑处理应用代码中数据显示的问题 【参考方案1】:

您需要的是所有日期的列表。如果你手头没有,你可以使用递归 CTE 创建:

with recursive dates as (
      select curdate() as dte, 1 as lev
      union all
      select dte - interval 1 day, lev + 1
      from dates
      where lev < 30
     )
select *
from dates;

然后您将其与left join 合并到您的查询中:

with recursive dates as (
      select curdate() as dte, 1 as lev
      union all
      select dte - interval 1 day, lev + 1
      from dates
      where lev < 30
     )
select d.dte, count(mc.id)
from dates d left join
     mymyv_cards mc 
     on mc.publicated = 1 and
        str_to_date(left(mc.publication_date, 10), '%d-%m-%Y') >= d.dte and
        str_to_date(left(mc.publication_date, 10), '%d-%m-%Y') < d.dte + interval 1 day
group by d.dte;

请注意,名为publication_date 的列应与值作为date 存储,而不是作为字符串。您应该真正修复数据模型,以便使用正确的类型存储数据。

此外,您的数据库中可能有一个数字表或日历表。如果是这样,您可以使用它来代替递归 CTE。

【讨论】:

以上是关于如何使用 0 值的 MySQL 获得最近 30 天的结果?的主要内容,如果未能解决你的问题,请参考以下文章

获得最近30天中每两天一个时间段

mySql 查询当天本周最近7天本月最近30天的语句

如何使用窗口函数获取每个日期值的今天、过去 7 天、过去 30 天的指标?

如何获得当前日期前 30 天?

如何在标准 SQL 的 BigQuery 中过滤具有 iso 周值的列?

如何在 MySQL 中获取两个值的最大值?