技术饭
Mysql如何查询连续的时间次数
在网上看到一道有意思的题目,大意是如何在mysql查询连续的时间内登录的次数。
原文链接:https://blog.csdn.net/qq_28867949/article/details/79434178
原文中相关说明很少,看起来很费劲,故在这里,我自己添加了些说明,完全是自己理解的,
若有不对,欢迎批评指正,谢谢。
在网上看到一道有意思的题目,大意是如何在mysql查询连续在线的天数。
所谓的连续在线是指相邻两天都登录过,不一定一直在线,但是只要有过登录即可。
如,1月1日登录了一会下线了,一月2日登录了一会下线了,那么,就算1月1日和2日是连续在线,天数为2。
如果1月3日,没有登录过,1月4日登录了,此时,1月4日与1月1日、2日不算连续在线了。
设连续在线天数为days,则1月1日在线,days=1;1月2日在线,days=2;1月3日不在线,1月4日在线,days=1;1月5日在线,days=2;
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(login_dt, @last_dt)=1) THEN
(@cont_day + 1)
WHEN (@last_uid = uid AND DATEDIFF(login_dt, @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 := login_dt login_day
FROM (SELECT uid, DATE(sts) AS login_dt
FROM tmysql_test_lianxu_3
ORDER BY uid, sts) AS t,
(SELECT @last_uid := '',
@last_dt := '',
@cont_ix := 0,
@cont_day := 0) AS t1) AS t2
GROUP BY uid, cont_ix;
文明上网理性发言!