SQL练习:SQL67_较难
题目:
查询每个用户最近一天登录的日子,用户的名字,以及用户用的设备的名字,并且查询结果按照user的name升序排序。
牛客每天有很多人登录,请你统计一下牛客每个用户最近登录是哪一天,用的是什么设备.
有一个登录(login)记录表,简况如下:
题解:
# 方式1:sqlite的解法
SELECT U.name u_n,C.name c_n,MAX(date) date
FROM login L,user U,client C
WHERE L.client_id = C.id AND L.user_id = U.id
GROUP BY 1
ORDER BY 1
# 方式2:三表连接+双重子查询
SELECT U.name u_n,C.name c_n,D.date date
FROM (SELECT *
FROM login L
WHERE (L.user_id,L.date) IN (SELECT L.user_id,MAX(L.date)
FROM login L
GROUP BY 1)
) D
JOIN user U ON U.id = D.user_id
JOIN client C ON C.id = D.client_id
ORDER BY 1
# 方式3:四表连接+子查询
SELECT U.name u_n,C.name c_n,L.date date
FROM login L
JOIN (SELECT user_id,MAX(date) date
FROM login
GROUP BY 1) T ON T.date = L.date AND T.user_id = L.user_id
JOIN user U ON U.id = L.user_id
JOIN client C ON C.id = L.client_id
ORDER BY 1
## 1.在MySQL中,和分组函数一同查询的字段必须是group by后出现的字段,此时方式1是错误的
## 2.方式2、3的思路都是,先找到对应的最近登录的记录,最后连表查询相应user与client的name
## 3.ORDER BY 1与GROUP BY 1中的【1】表示:第一个字段;与直接写字段等效,优点是简洁,缺点是不易维护
- 个人整理的笔记,仅供学习使用,有问题麻烦指正。
- 题目来源于:牛客网