如何使用 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 天的结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用窗口函数获取每个日期值的今天、过去 7 天、过去 30 天的指标?