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

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

解决思路:

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

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'

业务统计查询也按上述日期查询给统计日期和数量设置别名

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")

把两个查询用左连接合起,没数量的日期填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

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值