leecode-1747. 应该被禁止的Leetflex账户---神奇的inner join和between and搭配使用

应该被禁止的Leetflex账户
(这题真的是第一次不会,现在还是不会,最后看了别人的答案才会的)
题目分析:题目给了用户的id,用户的ip地址以及用户在这个ip上登录和登出的时间,表中的数据是有在同一时间段同时在两个设备上登录的信息的,要求查出同时登录的id。这题上来真的是完全没有思路,后来想到的是对比时间,但是拿啥对比呢?看了别人的答案才知道使用between and 可以对比。我们来看看具体的解决思路
首先是inner join自连接,然后使用between and来对比时间。这个时候使用的条件应该是相同的account_id下不同的ip地址,同时时间有交叉,然后选出其中distinct的id,可以按下面这个方式写

select distinct L1.account_id from LogInfo L1 inner join LogInfo L2 on L1.account_id = L2.account_id and (L2.login between L1.login and L1.logout) and L1.ip_address <> L2.ip_address

最主要的部分是inner join on后面的条件,一个一个来看。

L1.account_id = L2.account_id

这个就很明显,连接的条件,id是相同的,注意下面这个

L2.login between L1.login and L1.logout

这个就是要求连接的时间是要在一个区间之内的,如果在这个之内,那么在加上下面这个判断,就能筛选了

L1.ip_address <> L2.ip_address

至此,三个条件满足,相同id,不同ip,在同一时间段内在不同地址登录。
提交的就是

select distinct L1.account_id from LogInfo L1 inner join LogInfo L2 on L1.account_id = L2.account_id and (L2.login between L1.login and L1.logout) and L1.ip_address <> L2.ip_address;

提交结果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值