MySQL如何填补范围内缺less的date?
我有一个2列,date和得分的表。 它最多有30个参赛作品,最近30天的参赛作品之一。
date score ----------------- 1.8.2010 19 2.8.2010 21 4.8.2010 14 7.8.2010 10 10.8.2010 14
我的问题是有些date不见了 – 我想看看:
date score ----------------- 1.8.2010 19 2.8.2010 21 3.8.2010 0 4.8.2010 14 5.8.2010 0 6.8.2010 0 7.8.2010 10 ...
我需要从单个查询得到:19,21,9,14,0,0,10,0,0,14 …这意味着缺less的date是填充0。
我知道如何获取所有的值,并在服务器端语言遍历date和缺less空白。 但是这是可能的在MySQL中做的,所以我按datesorting的结果,并得到缺失的部分。
编辑:在这个表中有另一个名为UserID的列,所以我有30.000个用户,其中一些在这个表中有得分。 如果date<30天前,我每天都会删除date,因为我需要为每个用户提供最后30天的分数。 原因是我制作了过去30天的用户活动图,并绘制了我需要用逗号分隔的30个值的图表。 所以我可以说在查询让我的USERID = 10203活动和查询会得到我30分,每过去30天。 我希望我现在更清楚。
MySQL没有recursionfunction,所以你只剩下使用NUMBERS表格的技巧 –
-
创build一个只保存递增数字的表格 – 使用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构builddate列表,根据NUMBERS.id值增加date。 将“2010-06-06”和“2010-06-14”replace为相应的开始和结束date(但使用相同的格式,YYYY-MM-DD) –
SELECT `x`.* FROM (SELECT DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) FROM `numbers` `n` WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` -1 DAY) <= '2010-06-14' ) x
-
左join基于时间部分的数据表:
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') x LEFT JOIN TABLE `y` ON STR_TO_DATE(`y`.`date`, '%d.%m.%Y') = `x`.`ts`
如果要维护date格式,请使用DATE_FORMAT函数 :
DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`
您可以通过使用日历表来完成此操作。 这是您创build一次并填充date范围的表格(例如2000-2050每天的一个数据集;这取决于您的数据)。 然后你可以把你的表的外部联接到日历表上。 如果表格中缺lessdate,则返回0作为分数。