您应该创建一个日历表。如果您使用 MariaDB(以上 v10.1),有一种简单的方法可以生成临时日历表。然而,使用 MySQL,您将使用更长的查询(虽然不确定在最新的 MySQL 版本中)。请参考以下示例:
SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) as dates FROM
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4;
这将在 MySQL 中生成从 '1970-01-01' 到 '2243-10-16' 的日期范围,但当然您可以相应地更改它。为了创建一个calendar 表,我在这里准备了一个小提琴:https://www.db-fiddle.com/f/qVgmfDaVUszABAyFzH7iUS/3
我之前在这里也提供过更短日期范围的建议:https://stackoverflow.com/a/58443510/10910692 包括 MariaDB 建议;生成日期/日历的查询要短得多。
现在,如果您不创建 calendar 表,使用此方法您的查询将如下所示:
SELECT IFNULL(B.Total,0) AS Total, A.dates AS Date FROM
(SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) as dates FROM
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) A
LEFT JOIN
(SELECT
SUM(qty) as total,
DATE(time) as date
FROM t_order
where
DATE(TIME) between date('2020-02-15') and date('2020-02-26')
GROUP BY CAST(time AS date)) B
ON A.dates=B.date
WHERE A.dates BETWEEN '2020-02-15 and '2020-02-26';
它看起来很长而且没有必要。但是对于calendar 表,您只需要这样做:
SELECT IFNULL(B.Total,0) AS Total, A.dates AS Date
FROM calendar A
LEFT JOIN
(SELECT
SUM(qty) as total,
DATE(time) as date
FROM t_order
where
DATE(TIME) between date('2020-02-15') and date('2020-02-26')
GROUP BY CAST(time AS date)) B
ON A.dates=B.date
WHERE A.dates BETWEEN '2020-02-15 and '2020-02-26';