如果查询的时间不存在行,则SQL不返回值

时间:2019-12-27 11:07:26

标签: sql mariadb

我正在编写此SQL查询,该查询返回过去24小时在一小时内创建的记录数。我仅获得那些非零值的小时的结果。如果未创建任何记录,则根本不返回任何内容。

这是我的查询:

SELECT HOUR(timeStamp) as hour, COUNT(*) as count 
FROM `events` 
WHERE timeStamp > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(timeStamp)
ORDER BY HOUR(timeStamp)

当前查询的输出:

+-----------------+----------+
| hour            | count    |
+-----------------+----------+
|              14 |        6 |
|              15 |        5 |
+-----------------+----------+

但是我期望在0小时内不会创建任何记录。我要去哪里错了?

1 个答案:

答案 0 :(得分:3)

一种解决方案是生成一个从0到23的数字表,并将其与原始表连接起来。

这是一个使用递归查询生成小时列表的查询(如果您正在运行MySQL,则需要8.0版):

with hours as (
    select 0 hr
    union all select hr + 1 where h < 23
)
select h.hr, count(e.eventID) as cnt
from hours h
left join events e 
    on e.timestamp > now() - interval 1 day
    and hour(e.timestamp) = h.hr
group by h.hr

如果您的RDBMS不支持递归CTE,则一种选择是使用显式派生表:

select h.hr, count(e.eventID) as cnt
from (
    select 0 hr union all select 1 union all select 2 ... union all select 23
) h
left join events e 
    on e.timestamp > now() - interval 1 day
        and hour(e.timestamp) = h.hr
group by h.hr