在MySQL中按小时选择时如何防止出现空白?

时间:2010-11-11 23:06:49

标签: mysql select

我有当前的SQL查询来选择每小时的请求:

SELECT ((FLOOR( unix_timestamp(request_when)/(60*60))*(60*60))*1000) as request_when, COUNT(*) as amount 
FROM api_requests WHERE request_when BETWEEN SUBDATE(NOW(), INTERVAL 12 HOUR) AND NOW() 
GROUP BY HOUR(request_when) ORDER BY id DESC;

问题是当有0行时,它不会返回一行,这是根据查询预期的。但是,我希望它返回0(使用正确的日期时间/时间戳)。我玩过其他查询,但似乎都没有。

现在发生的一个示例输出是:

1289516400000   6
1289512800000   15
1289509200000   11
1289505600000   31
1289476800000   3

你会注意到它跳了几个小时。如果您不想进行数学计算,那么这些时间戳的日期时间值为

2010-11-11 12:00:00 3
2010-11-11 20:00:00 31
2010-11-11 21:00:00 11
2010-11-11 22:00:00 15
2010-11-11 23:00:00 7

我希望没有行(例如13-19小时)的时间返回“0”而不是没有行。这会使我想要的输出看起来像这样:

2010-11-11 12:00:00 3
2010-11-11 13:00:00 0
2010-11-11 14:00:00 0
2010-11-11 15:00:00 0
2010-11-11 16:00:00 0
2010-11-11 17:00:00 0
2010-11-11 18:00:00 0
2010-11-11 19:00:00 0
2010-11-11 20:00:00 31
2010-11-11 21:00:00 11
2010-11-11 22:00:00 15
2010-11-11 23:00:00 7

我继续创建了一个“助手”或“填充”表,其中的小时数从00到23,我尝试使用RIGHT JOIN,但我的查询返回0行,根本不起作用。 此查询不起作用如下所示:

SELECT ((FLOOR( unix_timestamp(request_when)/(60*60))*(60*60))*1000) as request_when, IFNULL(COUNT(*),0) as amount 
FROM api_requests RIGHT JOIN _filler ON (HOUR(api_requests.`request_when`) = _filler.`hours`)
WHERE request_when BETWEEN SUBDATE(NOW(), INTERVAL 12 HOUR) AND NOW() GROUP BY HOUR(request_when) ORDER BY api_requests.id DESC;

1 个答案:

答案 0 :(得分:0)

选择填充表中的值而不是数据表。我会把它改为

select ... from  _filler left join api_requests ...