【问题标题】:How to return the list of all previous 30 days in MySQL even with no records?即使没有记录,如何在 MySQL 中返回所有前 30 天的列表?
【发布时间】:2021-04-03 18:20:10
【问题描述】:

我有一个存储支持票的表。我需要在图表上显示一些统计数据。在其中一个图表中,我想显示过去 30 天内收到的门票的历史数据。
想象一下主票的结构是这样的:

票务表:

ticket_id date
1 2021-03-21
2 2021-03-21
3 2021-03-25
4 2021-03-26
5 2021-03-27
6 2021-03-27
7 2021-03-28

最后,我需要前 30 天的列表以及每张的总票数。像这样的:

.
.
.
2021-03-21 > 2
2021-03-22 > 0
2021-03-23 > 0
2021-03-24 > 0
2021-03-25 > 1
2021-03-26 > 1
2021-03-27 > 2
2021-03-28 > 1
2021-03-29 > 0
.
.
.

我可以检索过去 30 天的票证列表,但找不到票数为 0 的天数。另一方面,这些日子没有任何记录,但我需要一份完整的前 30 天清单。你能帮帮我吗?

【问题讨论】:

  • 考虑处理应用代码中数据显示的问题

标签: mysql date mariadb


【解决方案1】:

你可以使用日历表:

WITH calendar (
  SELECT '2021-03-01' + INTERVAL (seq) DAY AS d
  FROM seq_0_to_400
)
SELECT c.d, COUNT(t.date)
FROM calendar c
LEFT JOIN tickets t
  ON c.d = t.date
WHERE c.d BETWEEN ... AND ...;

db<>fiddle demo

【讨论】:

  • 谢谢@Lukasz,但是当我运行这段代码时,我收到了这个错误:&gt; 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'calendar AS (...
  • @MohammadSaberi 请检查 MariaDB 版本。它可能不支持序列。
  • 我已经检查过了,但没有发现 MySQL 和 MariaDB 之间有任何区别。 mariadb.com/kb/en/with/#examples
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2018-04-14
相关资源
最近更新 更多