使用表格:
id date_from date_to
---------------------------
1 2010-01-01 2010-03-01
2 2010-02-07 2010-05-01
3 2010-07-05 2010-07-10
我正在尝试返回一年中每个月有一行的结果,该结果让我知道该时段内有多少行处于活动状态。
所以对于上面我想要的结果
2010-01-01 1
2010-02-01 2
2010-03-01 2
2010-04-01 1
2010-05-01 1
2010-06-01 0
2010-07-01 1
2010-08-01 0
2010-09-01 0
etc...
我已尝试将我的MONTH(date_from)分组,但这不会返回没有结果的行
答案 0 :(得分:2)
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)
...根据需要提供尽可能多的价值。
使用DATE_ADD构建一个时间列表,根据NUMBERS.id值增加月份:
SELECT x.*
FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH), '%Y-%m-%d')
FROM numbers n) x
根据时间部分LEFT JOIN到您的数据表:
SELECT x.ts AS timestamp,
SUM(CASE WHEN x.ts BETWEEN y.date_from AND y.date_to THEN 1 ELSE 0 END) AS cnt
FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH), '%Y-%m-%d') AS ts
FROM numbers n) x
LEFT JOIN TABLE y ON x.ts BETWEEN y.date_from AND y.date_to
GROUP BY x.ts