可以使用MySQL的日期函数和IFNULL函数来实现这个需求。具体做法是,先生成一个包含所有小时的序列,然后左连接数据表,统计每个小时的数量。
示例代码如下:
```
SELECT
DATE_FORMAT(hour_seq.hour, '%Y-%m-%d %H:00:00') AS hour,
IFNULL(COUNT(data_table.id), 0) AS count
FROM
(
SELECT
'2022-01-01 00:00:00' + INTERVAL (a + b * 10) HOUR AS hour
FROM
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS hours,
(SELECT 0 AS b UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) AS tens
) AS hour_seq
LEFT JOIN data_table ON DATE_FORMAT(data_table.time, '%Y-%m-%d %H:00:00') = DATE_FORMAT(hour_seq.hour, '%Y-%m-%d %H:00:00')
WHERE
hour_seq.hour BETWEEN '2022-01-01 00:00:00' AND '2022-01-02 00:00:00'
GROUP BY
hour_seq.hour
ORDER BY
hour_seq.hour ASC;
```
其中,hour_seq是生成的包含所有小时的序列,data_table是数据表,time是数据表中的时间字段,id是数据表中的主键字段。在LEFT JOIN时,使用DATE_FORMAT函数将时间字段转换为小时级别,以便与hour_seq进行匹配。在SELECT时,使用IFNULL函数将没有数据的时间设置为0。
注意,这里假设需要统计2022年1月1日到2022年1月2日之间的数据,如果需要统计其他时间段的数据,需要修改WHERE子句中的时间范围。