我有一个表,有两列,日期和分数。它最多有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 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。。。这意味着丢失的日期用0填充。
我知道如何获得所有的值和在服务器端的语言遍历日期和遗漏空白。但这在mysql中是否可行,以便我按日期对结果进行排序并得到缺少的部分。
编辑:在这个表中有另一个名为userid的列,所以我有30000个用户,其中一些用户的得分在这个表中。如果日期<30天前,我会删除每天的日期,因为我需要每个用户的最后30天分数。原因是我正在制作一个过去30天内用户活动的图表,为了绘制一个图表,我需要用逗号分隔的30个值。所以我可以说在query get me中userid=10203活动,查询将得到30个分数,过去30天中每一天一个。我希望我现在更清楚了。
5条答案
按热度按时间woobm2wo1#
mysql没有递归功能,所以只能使用数字表技巧-
创建一个只包含递增数字的表-使用自动递增很容易:
使用以下方法填充表:
…尽可能多的价值观。
使用date\u add构建日期列表,根据numbers.id值增加天数。将“2010-06-06”和“2010-06-14”替换为各自的开始和结束日期(但使用相同的格式,yyyy-mm-dd)-
根据时间部分左键联接到数据表:
如果要保持日期格式,请使用“日期格式”功能:
ikfrs5lh2#
自从有人问这个问题以来,时间一天天过去了。MySQL8.0于2018年发布,增加了对递归公共表表达式的支持,为解决这个问题提供了一种优雅、最先进的方法。
以下查询可用于生成日期列表,例如2010年8月的前15天:
那你就可以了
left join
此结果集与表一起生成预期输出:db小提琴演示:
k2fxgqgv3#
迈克尔·科纳德的回答很好,但我需要15分钟的时间间隔,时间必须从每15分钟的顶端开始:
这会将当前时间设置为上一轮15分钟:
这将减少15分钟的时间:
如果有更简单的方法,请告诉我。
lkaoscv74#
我不喜欢其他答案,需要创建表格之类的。这个查询在没有helper表的情况下可以有效地执行。
让我们来分析一下。
if将检测没有得分的天数并将其设置为0。b、 days是从当前日期开始选择的已配置天数,最多1000天。
这个子查询是我在stackoverflow上看到的。它有效地生成一个从当前日期开始的过去1000天的列表。末尾where子句中的间隔(当前为30)决定返回哪些天;最大值为1000。这个查询可以很容易地修改为返回100年的日期,但是1000应该适合大多数情况。
这是将包含分数的表带入其中的部分。与日期生成器查询中选定的日期范围进行比较,以便能够在需要时填写0(分数将设置为0)
NULL
最初,因为它是一个LEFT JOIN
; 这在select语句中是固定的)。我也按日期点,只是因为。这是首选项,您也可以按分数排序。在
ORDER BY
您可以很容易地将您在编辑中提到的有关用户信息的表加入到表中,以添加最后一个要求。我希望这个版本的查询能帮助一些人。谢谢你的阅读。
93ze6v8z5#
您可以通过使用日历表来实现这一点。这是一个您创建一次并填充日期范围的表(例如,2000-2050年每天一个数据集;这取决于你的数据)。然后,可以将表与日历表进行外部联接。如果表中缺少日期,则返回0作为分数。