应该被禁止的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;
提交结果如下: