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 `example`.`numbers`
(
id
)
VALUES
( NULL )
…根据需要提供尽可能多的值。
使用DATE_ADD构造日期列表,并根据NUMBERS.id值增加日期。将“ 2010-06-06”和“ 2010-06-14”分别替换为您的开始日期和结束日期(但使用相同的格式,YYYY-MM-DD)-
SELECT `x`.*
FROM (SELECt DATE_ADD(‘2010-06-06’, INTERVAL
n
.id
- 1 DAY)
FROMnumbers
n
WHERe DATE_ADD(‘2010-06-06’, INTERVALn
.id
-1 DAY) <= ‘2010-06-14’ ) x根据时间部分将联接左移到数据表中:
SELECt `x`.`ts` AS `timestamp`, COALESCE(`y`.`score`, 0) AS `cnt` FROM (SELECt DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY), '%m/%d/%Y') AS `ts` FROM `numbers` `n` WHERe DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) <= '2010-06-14') xLEFT JOIN TABLE
y
ON STR_TO_DATE(y
.date
, ‘%d.%m.%Y’) =x
.ts
如果要维护日期格式,请使用DATE_FORMAT函数:
DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`



