MySQL按日统计数据,时间范围内无数据补0

需求:
统计用户在指定日期范围内的 日访问量 ,根据此数据画出走势图。
如果直接按照日期字段group by 查询,若某天没有访问,则该日期数据是不出现的,将导致走势图不能很好地表明当前状况,因此无数据情况下补0,来达成需求。

解决思路:

  1. 先用一个查询把指定日期范围的日期列表搞出来

    SELECT
    	@cdate := date_add(@cdate, INTERVAL - 1 DAY) AS date_str,
    	0 AS date_count
    FROM
    	(
    		SELECT
    			@cdate := date_add(CURDATE(), INTERVAL + 1 DAY)
    		FROM
    			数据库随便某个有数据的表名
    	) t1
    WHERE
    	@cdate > '2020-07-01'
    AND @cdate < '2020-07-31'
    
  2. 业务统计查询也按上述日期查询给统计日期和数量设置别名

    SELECT
    	FROM_UNIXTIME(m.时间戳字段, "%Y-%m-%d") AS date_str,
    	count(*) AS date_count
    FROM
    	业务数据表名 AS m
    GROUP BY
    	FROM_UNIXTIME(m.时间戳字段, "%Y-%m-%d")
    
  3. 把两个查询用左连接合起,没数量的日期填0

    SELECT
    	t1.date_str,COALESCE (t2.date_total_count, 0) AS date_total_count
    FROM
    	(
    		SELECT
    			@cdate := date_add(@cdate, INTERVAL - 1 DAY) AS date_str
    		FROM
    			(
    				SELECT
    					@cdate := date_add(CURDATE(), INTERVAL + 1 DAY)
    				FROM
    					业务数据表名
    			) tmp1
    		WHERE
    			@cdate > '2020-07-01'
    	) t1
    LEFT JOIN (
    	SELECT
    		FROM_UNIXTIME(m.时间戳字段, "%Y-%m-%d") AS date_str,
    		count(*) AS date_total_count
    	FROM
    		业务数据表名 AS m
    	WHERE
    		m.时间戳字段 > 'XXXX-XX-XX'
    	GROUP BY
    		FROM_UNIXTIME(m.时间戳字段, "%Y-%m-%d")
    ) t2 ON t1.date_str = t2.date_str
    

实际示例:

SELECT
	t1.logintime, COALESCE (t2.count, 0) AS count
FROM
	(
		SELECT@cdate := date_add(@cdate, INTERVAL - 1 DAY) AS logintime
		FROM
			(
				SELECT
					@cdate := date_add(CURDATE(), INTERVAL + 1 DAY)
				FROM
					tb_userloginhistory
			) tmp1
		WHERE
			@cdate > '2020-07-01'
	) t1
LEFT JOIN (
	SELECT
		FROM_UNIXTIME(logindatetime, "%Y-%m-%d") AS logintime, COUNT(1) AS count
	FROM
		tb_userloginhistory
	WHERE
		logindatetime > '2020-07-01'
	GROUP BY
		FROM_UNIXTIME(logindatetime, "%Y-%m-%d")
) t2 
ON t1.logintime = t2.logintime

运行结果:
运行结果图例

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值