【MySQL】查询两个日期之间最大的连续登录天数

需求场景:

开发中遇到需求,需要在用户学习日志中获取到某个用户在两个日期间最大的连续使用天数。

网上找到了以下解决方案,对于强需要在sql中实现的可以参考。


大致了解代码原理,等于是将一定条件下的用户日志查询出来单独形成一个数据池,再通过SQL语句处理这部分数据,累计统计。

类似处理方式查出数据池后再通过后端代码循环处理一样可以实现,且能分担数据库压力,性能应该会更优。



解决方案:

SELECT *
FROM (SELECT *
   FROM (
       SELECT
        uid,
        max(days)   lianxu_days,
        min(login_day) start_date,
        max(login_day) end_date
       FROM (SELECT
           uid,
           @cont_day :=
           (CASE
           WHEN (@last_uid = uid AND DATEDIFF(addtime, @last_dt) = 1)
            THEN
             (@cont_day + 1)
           WHEN (@last_uid = uid AND DATEDIFF(addtime, @last_dt) < 1)
            THEN
             (@cont_day + 0)
           ELSE
            1
           END)                       AS days,
           (@cont_ix := (@cont_ix + IF(@cont_day = 1, 1, 0))) AS cont_ix,
           @last_uid := uid,
           @last_dt := addtime                login_day
          FROM (SELECT
              uid,
              DATE(addtime) addtime
             FROM web_question_log
             WHERE uid != 0
             ORDER BY uid, addtime) AS t,
           (SELECT
            @last_uid := '',
            @last_dt := '',
            @cont_ix := 0,
            @cont_day := 0) AS t1
         ) AS t2
       GROUP BY uid, cont_ix
       HAVING lianxu_days > 10
      ) tmp
   ORDER BY lianxu_days DESC) ntmp
GROUP BY uid;


代码看起来还是有点繁杂的。 经过测试能顺利获得数据。


使用方法:

web_question_log   ---  你的日志表名

uid                           ---  用户id字段

addtime                   ---  日志数据的创建日期字段


主要调整代码中的这段语句(用于查询出最原始的数据池):

SELECT uid,DATE(addtime) addtime FROM web_question_log WHERE uid != 0 ORDER BY uid, addtime

可根据自己的需求定义数据池的数据范围。

猿教程
请先登录后发表评论
  • 最新评论
  • 总共0条评论