题
例如,如果我有一个像这样的表
total date
10 2010-01-01
15 2010-01-02
98 2010-01-03
50 2010-01-05
.
如何编写SELECT语句以如此获取输出?
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)
...适用于您需要的数量。在这种情况下,插入语句需要至少运行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
-
使用外连接来获得所需的输出:
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
为什么数字,不是日期?
简单 - 可以基于该号码生成日期,例如在我提供的示例中。它还意味着使用单个表,Vs每数据类型说一个。
不隶属于 StackOverflow