学习笔记之mysql求用户登录时间间隔

小白学习记录

昨天在练sql的时候,看到这样一个题目

我的代码是这个样子的

set @i:=0;
set @j:=0;
SELECT tt1.user_id,tt1.login_time ,TIMEDIFF(tt2.login_time,tt1.login_time) as jiange  FROM
(
SELECT	t1.*
				,@i := @i + 1 as rank 
FROM(	
SELECT	user_id
				,login_time
FROM login_info GROUP BY user_id,login_time) t1 )tt1 
JOIN
(
SELECT	t2.*
				,@j := @j + 1 as rank 
FROM(	
SELECT	user_id
				,login_time
FROM login_info GROUP BY user_id,login_time) t2 )tt2
ON tt1.user_id=tt2.user_id
WHERE tt2.rank-tt1.rank = 1 AND tt2.user_id=tt1.user_id

 先说一下我的思路:先将group by user_id,login_time,再定义一个变量,从上到下排序叫做rank,和一张一样的表join一下就成了这样

然后再套一个select把两张表里面id相同,rank值差1的做差(timediff)就可以把同一个人的登录时间差给求出来了,结果如下:

但我觉得这个sql写的好傻,暂时又想不到其他可以优化的方法,我就去问了我的老师,

老师给我的代码时这个样子的

select	user_id
				,login_time
				,(select	max(login_time) 
					from login_info t2 
					where t1.login_time>t2.login_time and t1.user_id=t2.user_id)  as prev_time 
from login_info t1;

我的跟这个对比,简直依托答辩,这个代码运行出来是这个样子的 

说一下老师的思路吧

要求登录时间差,在表的后面接上一个离该条记录时间最近的一条时间,那怎么求呢,比如第五条数据 11:15:00 ,只要求出所有比他小的时间中的最大值,不就是离他最近的时间了吗,当然user_id要 相同。

简简单单的思路怎么就没想到呢,起司沃勒。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值