牛客在线编程练习:SQL67_较难

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】表示:第一个字段;与直接写字段等效,优点是简洁,缺点是不易维护
  • 个人整理的笔记,仅供学习使用,有问题麻烦指正。
  • 题目来源于:牛客网
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值