需求场景:
开发中遇到需求,需要在用户学习日志中获取到某个用户在两个日期间最大的连续使用天数。
网上找到了以下解决方案,对于强需要在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
可根据自己的需求定义数据池的数据范围。
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com