SQL面试题练习 —— 共同使用ip用户检测问题

目录

  • [1 题目](#1 题目)
  • [2 建表语句](#2 建表语句)
  • [3 题解](#3 题解)

题目来源:字节跳动。

1 题目

现有用户登录日志表,记录了每个用户登录的IP地址,请查询共同使用过3个及以上IP的用户对;

样例数据

复制代码
+----------+-----------------+----------------------+
| user_id  |       ip        |      time_stamp      |
+----------+-----------------+----------------------+
| 2        | 223.104.41.101  | 2023-08-24 07:00:00  |
| 4        | 223.104.41.122  | 2023-08-24 10:00:00  |
| 5        | 223.104.41.126  | 2023-08-24 11:00:00  |
| 4        | 223.104.41.126  | 2023-08-24 13:00:00  |
| 1        | 223.104.41.101  | 2023-08-24 16:00:00  |
| 3        | 223.104.41.101  | 2023-08-24 16:02:00  |
| 2        | 223.104.41.104  | 2023-08-24 16:30:00  |
| 1        | 223.104.41.121  | 2023-08-24 17:00:00  |
| 2        | 223.104.41.122  | 2023-08-24 17:05:00  |
| 3        | 223.104.41.103  | 2023-08-24 18:11:00  |
| 2        | 223.104.41.103  | 2023-08-24 19:00:00  |
| 1        | 223.104.41.104  | 2023-08-24 19:00:00  |
| 3        | 223.104.41.122  | 2023-08-24 19:07:00  |
| 1        | 223.104.41.122  | 2023-08-24 21:00:00  |
+----------+-----------------+----------------------+

2 建表语句

sql 复制代码
--建表语句
CREATE TABLE t_login_log (
user_id bigint COMMENT '用户ID',
ip string COMMENT '用户登录ip地址',
time_stamp string COMMENT '登录时间'
) COMMENT '用户登录记录表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
;
-- 插入数据
insert into t_login_log(user_id,ip,time_stamp)
values
(1,'223.104.41.101','2023-08-24 16:00:00'),
(1,'223.104.41.121','2023-08-24 17:00:00'),
(1,'223.104.41.104','2023-08-24 19:00:00'),
(1,'223.104.41.122','2023-08-24 21:00:00'),
(1,'223.104.41.122','2023-08-24 22:00:00'),
(2,'223.104.41.101','2023-08-24 07:00:00'),
(2,'223.104.41.103','2023-08-24 19:00:00'),
(2,'223.104.41.104','2023-08-24 16:30:00'),
(2,'223.104.41.122','2023-08-24 17:05:00'),
(3,'223.104.41.103','2023-08-24 18:11:00'),
(3,'223.104.41.122','2023-08-24 19:07:00'),
(3,'223.104.41.101','2023-08-24 16:02:00'),
(4,'223.104.41.126','2023-08-24 13:00:00'),
(5,'223.104.41.126','2023-08-24 11:00:00'),
(4,'223.104.41.122','2023-08-24 10:00:00');

3 题解

(1)将所有用户登录记录按照用户ID和登录IP去重

sql 复制代码
select user_id,
       ip
from t_login_log
group by user_id, ip

执行结果

复制代码
+----------+-----------------+
| user_id  |       ip        |
+----------+-----------------+
| 1        | 223.104.41.101  |
| 1        | 223.104.41.104  |
| 1        | 223.104.41.121  |
| 1        | 223.104.41.122  |
| 2        | 223.104.41.101  |
| 2        | 223.104.41.103  |
| 2        | 223.104.41.104  |
| 2        | 223.104.41.122  |
| 3        | 223.104.41.101  |
| 3        | 223.104.41.103  |
| 3        | 223.104.41.122  |
| 4        | 223.104.41.122  |
| 4        | 223.104.41.126  |
| 5        | 223.104.41.126  |
+----------+-----------------+

(2)通过IP地址进行自关联,去重,剔除相同用户。

sql 复制代码
with tmp as
         (select user_id,
                 ip
          from t_login_log
          group by user_id, ip)
select t1.user_id,
       t2.user_id,
       t1.ip
from tmp as t1
         join
     tmp as t2
     on t1.ip = t2.ip
where t1.user_id < t2.user_id

执行结果

复制代码
+-------------+-------------+-----------------+
| t1.user_id  | t2.user_id  |      t1.ip      |
+-------------+-------------+-----------------+
| 1           | 2           | 223.104.41.101  |
| 1           | 3           | 223.104.41.101  |
| 2           | 3           | 223.104.41.101  |
| 2           | 3           | 223.104.41.103  |
| 1           | 2           | 223.104.41.104  |
| 1           | 2           | 223.104.41.122  |
| 1           | 3           | 223.104.41.122  |
| 1           | 4           | 223.104.41.122  |
| 2           | 3           | 223.104.41.122  |
| 2           | 4           | 223.104.41.122  |
| 3           | 4           | 223.104.41.122  |
| 4           | 5           | 223.104.41.126  |
+-------------+-------------+-----------------+

(3)根据用户组计算使用共同IP的个数

sql 复制代码
with tmp as
         (select user_id,
                 ip
          from t_login_log
          group by user_id, ip)
select t1.user_id,
       t2.user_id,
       count(t1.ip)
from tmp as t1
         join
     tmp as t2
     on t1.ip = t2.ip
where t1.user_id < t2.user_id
group by t1.user_id,
         t2.user_id

执行结果

复制代码
+-------------+-------------+------+
| t1.user_id  | t2.user_id  | _c2  |
+-------------+-------------+------+
| 1           | 2           | 3    |
| 1           | 3           | 2    |
| 1           | 4           | 1    |
| 2           | 3           | 3    |
| 2           | 4           | 1    |
| 3           | 4           | 1    |
| 4           | 5           | 1    |
+-------------+-------------+------+

(4)查询共同使用过3个以上IP的用户对

sql 复制代码
with tmp as
         (select user_id,
                 ip
          from t_login_log
          group by user_id, ip)
select t1.user_id,
       t2.user_id
from tmp as t1
         join
     tmp as t2
     on t1.ip = t2.ip
where t1.user_id < t2.user_id
group by t1.user_id,
         t2.user_id
having count(t1.ip) >= 3

执行结果

复制代码
+-------------+-------------+
| t1.user_id  | t2.user_id  |
+-------------+-------------+
| 1           | 2           |
| 2           | 3           |
+-------------+-------------+
相关推荐
KellenKellenHao1 小时前
MySQL数据库主从复制
数据库·mysql
@ chen1 小时前
Redis事务机制
数据库·redis
KaiwuDB1 小时前
使用Docker实现KWDB数据库的快速部署与配置
数据库·docker
一只fish2 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(16)
数据库·mysql
泊浮目2 小时前
未来数据库硬件-网络篇
数据库·架构·云计算
静若繁花_jingjing3 小时前
Redis线程模型
java·数据库·redis
飞翔的佩奇4 小时前
Java项目:基于SSM框架实现的忘忧小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
java·数据库·mysql·vue·毕业设计·ssm框架·小区物业管理系统
亚马逊云开发者4 小时前
全景解读亚马逊云科技的 GenBI 解决方案:三大路径助力企业智能决策升级
sql·llm
ZWZhangYu10 小时前
LangChain 构建向量数据库和检索器
数据库·langchain·easyui
feifeigo12311 小时前
升级到MySQL 8.4,MySQL启动报错:io_setup() failed with EAGAIN
数据库·mysql·adb