MySQL如何计算连续登录天数

 更新时间:2022年05月09日 09:37:25   作者:BurningSilence  
这篇文章主要介绍了MySQL如何计算连续登录天数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

建表、insert数据

create table tmp_login (
  user_id int(11) ,
  login_date datetime
);
insert into tmp_login values(2,'2020-05-29 11:12:12');
insert into tmp_login values(2,'2020-05-29 15:12:12');
insert into tmp_login values(2,'2020-05-30 11:12:12');
insert into tmp_login values(2,'2020-05-31 11:12:12');
insert into tmp_login values(2,'2020-06-01 11:12:12');
insert into tmp_login values(2,'2020-06-02 11:12:12');
insert into tmp_login values(2,'2020-06-03 11:12:12');
insert into tmp_login values(2,'2020-06-04 11:12:12');
insert into tmp_login values(2,'2020-06-05 11:12:12');
insert into tmp_login values(2,'2020-06-06 11:12:12');
insert into tmp_login values(2,'2020-06-07 11:12:12');
insert into tmp_login values(7,'2020-06-01 11:12:12');
insert into tmp_login values(7,'2020-06-02 11:12:12');
insert into tmp_login values(7,'2020-06-03 11:12:12');
insert into tmp_login values(7,'2020-06-05 11:12:12');
insert into tmp_login values(7,'2020-06-06 11:12:12');
insert into tmp_login values(7,'2020-06-07 11:12:12');
insert into tmp_login values(7,'2020-06-08 11:12:12');

方法一 row_number()

1.查询所有用户的每日登录记录

select distinct user_id, date(login_date) as days 
from tmp_login;

在这里插入图片描述

2.row_number()计算登录时间排序

select user_id, days, row_number() over(partition by user_id order by days) as rn
from (
	select distinct user_id, date(login_date) as days from tmp_login) t1;

在这里插入图片描述

3.用登录时间 - row_number(),如果得到的日期相同,则认为是连续登录日期

select *, date_sub(days, interval rn day) as  results
from(
	select user_id, days, row_number() over(partition by user_id order by days) as rn
	from (
		select distinct user_id, date(login_date) as days from tmp_login) t1
) t2;

在这里插入图片描述

4. 按user_id、results分组就可得出连续登录天数

select user_id, count(*) as num_days
from (
	select *, date_sub(days, interval rn day) as  results
	from(
		select user_id, days, row_number() over(partition by user_id order by days) as rn
		from (
			select distinct user_id, date(login_date) as days from tmp_login) t1
	) t2) t3
group by user_id , results;

在这里插入图片描述

直接用日期减去row_number(),不用date_sub的话,遇到登录日期跨月时会计算错误,

方法二lead() 或 lag()

这种情况适合的场景是,需要查找连续登录超过n天的用户,n为确定值

如果n为4,即计算连续登录超过4天的用户

-- lead计算连续登录
select distinct user_id 
from(
	select user_id, days, datediff(lead(days, 3, '1970-01-01') over(partition by user_id order by days), days)as results
	from (
		select distinct user_id, date(login_date) as days from tmp_login) t1) t2
where results = 3;

连续登录4天,则日期差应该为3。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql对于模糊查询like的一些汇总

    mysql对于模糊查询like的一些汇总

    这篇文章主要给大家介绍了关于mysql对于模糊查询like的一些汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Navicat连接linux虚拟机上的MySQL可能遇到的问题及排查方法

    Navicat连接linux虚拟机上的MySQL可能遇到的问题及排查方法

    这篇文章主要介绍了Navicat连接linux虚拟机上的MySQL可能遇到的问题以及如何排查,本文给大家展示了问题描述及解决方法,需要的朋友可以参考下
    2024-02-02
  • 详解关于MySQL 8.0走过的坑

    详解关于MySQL 8.0走过的坑

    这篇文章主要介绍了详解关于MySQL 8.0走过的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Linux下卸载MySQL数据库

    Linux下卸载MySQL数据库

    如何在Linux平台卸载MySQL呢?这篇文章主要介绍了Linux下卸载MySQL数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • mysql心得分享:存储过程

    mysql心得分享:存储过程

    MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本文主要来分享下本人关于存储过程的一些心得体会。
    2014-07-07
  • Mysql入门基础 数据库创建篇

    Mysql入门基础 数据库创建篇

    Mysql入门基础 数据库创建篇,刚接触php与mysql的朋友可以参考下。多写多测试。
    2010-04-04
  • idea中使用mysql的保姆级教程(超详细)

    idea中使用mysql的保姆级教程(超详细)

    我们开发时经常需要用到一些客户端去访问数据库查询、更新数据等操作,下面这篇文章主要给大家介绍了关于idea中使用mysql的保姆级教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Linux下编译安装Mysql 5.5的简单步骤

    Linux下编译安装Mysql 5.5的简单步骤

    Linux下面因为从MySQL 5.5开始使用cmake来做config了,所以编译安装的会和5.1版本有些区别。不过总体来说还是差别不大
    2015-08-08
  • MySQL基本运维命令详解

    MySQL基本运维命令详解

    这篇文章主要介绍了MySQL基本运维命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • MySQL读取JSON转换的方式

    MySQL读取JSON转换的方式

    这篇文章主要介绍了MySQL读取JSON转换的方式,本文给大家分享两种方式给大家讲解处理方式,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03

最新评论