本篇文章小编给大家分享一下MySQL按小时查询数据没有的补0代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
需求背景
一个统计接口,前端需要返回两个数组,一个是0-23的小时计数,一个是各小时对应的统计数。
思路 直接使用group by查询要统计的表,当某个小时统计数为0时,会没有该小时分组。思考了一下,需要建立辅助表,只有一列小时,再插入0-23共24个小时
CREATE TABLE hours_list ( hour int NOT NULL PRIMARY KEY )
先查小时表,再做连接需要查的表,即可将没有统计数的小时填充上0。这里由于需要查多个表中,create_time在每个小时区间内、且SOURCE_ID等于查询条件的统计之和,所以UNION ALL了多张表
SELECT
t.HOUR,
sum(t.HOUR_COUNT) hourCount
FROM
(SELECT
hs. HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_0002 cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_hs cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_kfyj cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_his_0002 cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_his_hs cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR
UNION ALL
SELECT
hs.HOUR AS HOUR,
COUNT(cs.RECORD_ID) AS HOUR_COUNT
FROM
cbc_hours_list hs
LEFT JOIN cbc_source_his_kfyj cs ON HOUR (cs.create_time) = hs. HOUR
AND cs.create_time > #{startTime}
AND cs.create_time <= #{endTime}
<#if sourceId?exists && sourceId !=''>
AND SOURCE_ID = #{sourceId}
#if>
GROUP BY
hs. HOUR) t
GROUP BY
t.hour
效果
统计数为0的小时也可以查出来了。
疯狂医院达什医生中文版(Crazy Hospital)
疯狂医院达什医生最新版是一款医院模拟经营类游戏,逼真的场景画
宝宝庄园官方版
宝宝庄园官方版是一款超级经典好玩的模拟经营类型的手游,这个游
桃源记官方正版
桃源记是一款休闲娱乐类的水墨手绘风格打造的模拟经营手游。玩家
长途巴士模拟器手机版
长途巴士模拟器汉化版是一款十分比真好玩的大巴车模拟驾驶运营类
房东模拟器最新版2024
房东模拟器中文版是一个超级有趣的模拟经营类型的手游,这个游戏