MySQL统计近30天的数据,无数据的填充0 。这个应该是我们在做统计分析的时候,经常遇到的一个需求 。
先说一般的实现方式,就是按照日期进行分组,但是这样会有一个问题,如果数据库表中有一天没有数据,那么是统计不出来结果的 。类似下图
2020-01-01102020-01-03202020-01-044【Mysql统计近30天的数据,无数据的填充0】这个时候,我们发现,2020-01-02 这一天是没有数据的,我们希望没有数据的这一天也能返回日期,而对应的数据是0,期望如下:
2020-01-01102020-01-0202020-01-03202020-01-044这时候,单单group by就没办法实现了 。
那应该怎么办呢?
一般情况就是我们应该先获取一个日期的虚拟表,把这30天的时间都列出来,然后用这个日期虚拟表再去关联我们的业务表,关联没数据的值设置为空即可,那么怎么得到近30天的日期的,给出sql实现方式
SELECT@s := @s + 1 AS indexs,DATE_FORMAT( DATE( DATE_SUB( CURRENT_DATE, INTERVAL @s DAY ) ), '%Y-%m-%d' ) AS dates FROMmysql.help_topic,( SELECT @s := -1 ) temp#不想包含当天,@s:=0WHERE@s < 30 ORDER BYdates 运行得到的结果如下

文章插图
当然可根据自己的需要进行排序,时间有了,接下来直接关联自己的业务表就可以了,给出demo:
SELECT date_table.dates AS dateValue, IFNULL( temp.count, 0 ) AS count FROM ( SELECT@s := @s + 1 AS indexs,DATE_FORMAT( DATE( DATE_SUB( CURRENT_DATE, INTERVAL @s DAY ) ), '%Y-%m-%d' ) AS datesFROMmysql.help_topic,( SELECT @s := 0 ) tempWHERE@s < 30ORDER BYdates) date_table LEFT JOIN ( SELECT LEFT( create_time, 10 ) AS dateValue,count( * ) AS countFROMmonitor_log_record t1WHEREt1.log_type = 1AND t1.error_type = 1AND t1.project_id = 1GROUP BYLEFT ( create_time, 10 )) temp ON date_table.dates = temp.dateValue ORDER BY date_table.dates DESC好了,记录一下,希望可以帮助到你 。有帮助的话记得点赞收藏加关注,感谢!!推荐阅读
- * mysql中count和count(1)哪个效率高?
- 面包机的做法家庭做法比例 面包机怎么做面包
- 贴近自然的茶文化
- 亚冠-国安2-1首尔FC
- 乌金木家具十大品牌
- 武磊叙利亚绝平 国足与叙利亚
- 张家界黑导游事件 张家界旅游骗局大揭秘
- 龚俊和宋伊人演过的电视剧 龚俊宋伊人所有花絮
- 牛扒怎么做才嫩 牛扒怎么做
- 村民挖到大铁疙瘩想割开卖 村民挖到铁疙瘩
