MySQL求连续登陆天数-鹅厂面试题 简单解法

在墨天轮上看到一个有意思的面试题

需求是这样的
求每个用户的最长连续登录天数,两个日期的间隔小于或等于 3 均视为连续登录。比如 01-01 号登录,最近的下一次登录是 01-04 号,两个日期的间隔等于 3 天,因此这两个日期之间的天数都算作活跃天数,一共 4 天。

也贴上原贴解决方法:
https://www.modb.pro/db/43021?yll

但我觉得此方法太复杂,特别是5.x版本。 我进行了改写

上代码 构造测试数据

create table test_login(user_id int,login_date timestamp);

insert into test_login values (1,'2020-01-01 00:01:00');
insert into test_login values (1,'2020-01-01 00:02:00');
insert into test_login values (1,'2020-01-01 00:03:00');
insert into test_login values (1,'2020-01-02 00:03:00');
insert into test_login values (1,'2020-01-05 00:03:00');
insert into test_login values (1,'2020-01-07 00:03:00');  -- 这里一直从 1号到7号 符合需求中间未有间断3天的。所以连续登陆7天
insert into test_login values (1,'2020-01-11 00:03:00');  -- 这里超过了三天,需重新计数
insert into test_login values (1,'2020-01-12 00:03:00');
insert into test_login values (1,'2020-01-13 00:03:00');
insert into test_login values (1,'2020-01-14 00:03:00');
insert into test_login values (1,'2020-01-17 00:03:00');
insert into test_login values (1,'2020-01-18 00:03:00');
insert into test_login values (1,'2020-01-19 00:03:00');
insert into test_login values (1,'2020-01-22 00:03:00');     -- 这里从11号到22号 符合需求中间未有间断3天的。连续登陆12天

insert into test_login values (2,'2020-01-01 00:04:00'); -- userid 变了,重新计数
insert into test_login values (2,'2020-01-01 00:05:00');
insert into test_login values (2,'2020-01-01 00:06:00');
insert into test_login values (2,'2020-01-02 00:06:00');  -- 1号到2号  连续登陆2天
insert into test_login values (2,'2020-01-07 00:06:00');  -- 7号1天 连续登陆 1天
insert into test_login values (2,'2020-01-11 00:06:00');  
insert into test_login values (2,'2020-01-12 00:06:00');
insert into test_login values (2,'2020-01-14 00:06:00'); --  11号到14号 连续登陆 4天
insert into test_login values (2,'2020-01-18 00:06:00');
insert into test_login values (2,'2020-01-19 00:06:00');
insert into test_login values (2,'2020-01-22 00:06:00'); --  18号到 22 号 连续登陆 5天

贴上解决方案

with tmp1 AS
-- tmp1临时表 一天多次登陆算一次
(
SELECT user_id,date_format(login_date,'%Y-%m-%d') login_date
  from test_login 
 group by user_id,date_format(login_date,'%Y-%m-%d')
),
tmp2 as
(
  select user_id,login_date, if(@id = user_id and DATEDIFF(login_date,@up_date) <= 3,@cnt := @cnt + DATEDIFF(login_date,@up_date),@cnt := 1 ) as days,(@id := user_id),(@up_date := login_date)     
  from tmp1,(select @id := user_id,@up_date := login_date,@cnt := 1 from tmp1 order by  user_id,login_date limit 1 ) as t
  order by  user_id,login_date
)
select user_id,max(days) as max_days  from tmp2
group by user_id

执行的结果
uesr_id max_days
1 12
2 5

这种解法就用了最基础的知识点 mysql select 的执行顺序。 列的话是从左到右的。

传送门 https://www.jianshu.com/p/6b4817d8da59

你可能感兴趣的:(MySQL求连续登陆天数-鹅厂面试题 简单解法)