例如,如果我有一张这样的桌子
total date
10 2010-01-01
15 2010-01-02
98 2010-01-03
50 2010-01-05
如何编写选择语句来获得这样的输出?
total date
10 2010-01-01
15 2010-01-02
98 2010-01-03
0 2010-01-04
50 2010-01-05
例如,如果我有一张这样的桌子
total date
10 2010-01-01
15 2010-01-02
98 2010-01-03
50 2010-01-05
如何编写选择语句来获得这样的输出?
total date
10 2010-01-01
15 2010-01-02
98 2010-01-03
0 2010-01-04
50 2010-01-05
MySQL 没有递归功能,因此您只能使用NUMBERS
表格技巧 -
创建一个只包含递增数字的表 - 使用 auto_increment 很容易做到:
DROP TABLE IF EXISTS `example`.`numbers`;
CREATE TABLE `example`.`numbers` (
`id` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
使用以下方法填充表:
INSERT INTO NUMBERS
(id)
VALUES
(NULL)
...根据需要获取尽可能多的值。在这种情况下,INSERT 语句至少需要运行 31 次。
使用DATE_ADD构造天数列表,根据NUMBERS.id
值增加:
SELECT x.dt
FROM (SELECT DATE(DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY)) AS dt
FROM numbers n
WHERE DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY) <= '2010-01-05' ) x
使用 OUTER JOIN 获得所需的输出:
SELECT x.dt,
COUNT(*) AS total
FROM (SELECT DATE(DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY)) AS dt
FROM numbers n
WHERE DATE_ADD('2010-01-01', INTERVAL (n.id - 1) DAY) <= '2010-01-05' ) x
LEFT JOIN YOUR_TABLE y ON y.date = x.dt
GROUP BY x.dt
ORDER BY x.dt
简单 - 可以根据数字生成日期,就像我提供的示例一样。这也意味着使用一个表,而不是每个数据类型一个表。