MySQL 计算连续登录天数


Posted in MySQL onMay 11, 2022

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;

MySQL 计算连续登录天数

  1. 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;

MySQL 计算连续登录天数

  1. 用登录时间 - 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;

MySQL 计算连续登录天数
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;

MySQL 计算连续登录天数
直接用日期减去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 相关文章推荐
MySQL令人咋舌的隐式转换
Apr 05 MySQL
Mysql 性能监控及调优
Apr 06 MySQL
MySQL 使用自定义变量进行查询优化
May 14 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
MySQL优化及索引解析
Mar 17 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
MySQL提取JSON字段数据实现查询
Apr 22 MySQL
mysql如何查询连续记录
May 11 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
mysql 获取相邻数据项
May 11 #MySQL
MySQL脏读,幻读和不可重复读
May 11 #MySQL
MySql数据库 查询时间序列间隔
May 11 #MySQL
Mysql中常用的join连接方式
May 11 #MySQL
MySQL的prepare使用以及遇到的bug
May 11 #MySQL
MySQL批量更新不同表中的数据
May 11 #MySQL
mysql查找连续出现n次以上的数字
May 11 #MySQL
You might like
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP多进程简单实例小结
2019/11/09 PHP
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
js实现简单贪吃蛇游戏
2020/05/15 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
python基础教程之循环介绍
2014/08/29 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
python中as用法实例分析
2015/04/30 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
python判断数字是否是超级素数幂
2018/09/27 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
python解包概念及实例
2021/02/17 Python
土木工程实习生自我鉴定
2013/09/19 职场文书
绘画设计学生的个人自我评价
2013/09/20 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
2014年政工师工作总结
2014/12/18 职场文书
上课说话检讨书
2015/01/27 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
亲情作文之母爱
2019/09/25 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL