前言
练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。
今日题目:
1407.排名靠前的旅行者
表:Users
列名 | 类型 |
---|---|
id | int |
name | varchar |
id 是该表中具有唯一值的列。name 是用户名字。
表:Rides
列名 | 类型 |
---|---|
id | int |
user_id | int |
distance | int |
id 是该表中具有唯一值的列。user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance 。
我那不值一提的想法:
首先梳理表内容,题干给了两张表,第一张用户表,记录了用户id和姓名,第二张旅行表,记录了id,和用户id和距离,其中用户id和第一张表的id一样。其次分析需求,需要报告每个用户的旅行距离,并且有不一样的逻辑判断,那么我们就先满足距离,在满足名字,就是把距离放在order by 的前面一个值。初次之外,对于没有距离的用户,我们还需要显示出来,并标识为0,这里我们使用ifnull判断,如果是空值,择改成0。
我一开是是用name去分组的,但是如果用name分组就忽略了名字一样的情况,就会出现错误,我们应该用表的主键唯一列id进行分组,也就是order by u.id
select u.name,ifnull(sum(r.distance),0) as travelled_distance
from Users u
left join Rides r
on u.id = r.user_id
group by u.name
order by sum(r.distance) desc,u.name
也就是这样:
select u.name,ifnull(sum(r.distance),0) as travelled_distance
from Users u
left join Rides r
on u.id = r.user_id
group by u.id
order by sum(r.distance) desc,u.name
结果:
总结:
能运行就行。