持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
leetcode刷题1407-排名靠前的旅行者
前文
本文内容为leetcode数据库类型题目,主要考查对于查询相关知识的掌握。本文解题方案为个人理解,并非最佳解决方案。该题目序号为1407,题目链接为leetcode.cn/problems/to…
题目信息
表:Users
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id 是该表单主键。 name 是用户名字。
表:Rides
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| user_id | int |
| distance | int |
+---------------+---------+
id 是该表单主键。 user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance 。
写一段 SQL , 报告每个用户的旅行距离。
返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列 。
题目分析
根据题目信息,本题目提供了用户表及旅行表两张表。两张表采用用户id的字段关联。本题目的要求为计算用户的实际旅行距离。因此很容易想到采用根据用户分组的方式。将用户进行分组后,我们采用聚合函数将表中对应用户的旅行距离进行相加得到实际的旅行总距离。但要注意的是,如果一个用户存在但没有旅行记录,我们也需要将他显示出来,且旅行总距离标记为0。这时候我们需要用到ifnull这个函数,如果距离不存在则默认设置为0,如果距离存在则直接采用实际的距离标记。通过该函数,我们即可实现对于未旅行用户标记为0的处理。通过分组操作和ifnull函数的结合,即可得到我们目标的数据查询结果,至此,题目解答完毕。
解题答案
# Write your MySQL query statement below
select
b.name, ifnull(sum(a.distance),0) as travelled_distance
from Users b
left join Rides a
on a.user_id = b.id
group by b.id
order by travelled_distance desc,b.name
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。