1407-排名靠前的旅行者
排名靠前的旅行者
- 题目如下所示
个人题解
这题很经典,不过也不难。以下是我个人的思考过程
-
-- 1. 建表 CREATE TABLE 1407_Users( id INT auto_increment, name VARCHAR(20), PRIMARY KEY(id) ); CREATE TABLE 1407_Rides( id INT auto_increment, user_id INT, -- 本次行程的用户 id distance INT, -- 该用户此次行程距离 PRIMARY KEY(id) ); -- 2. 编写 SQL,查询每个用户的旅行距离 -- PS:结果以 travelled_distance 降序排列,如果有两个或者更多的用户旅行了相同的距离,那么再以 name 升序排列 SELECT u.`name`, IF(ISNULL(SUM(r.distance)),0, SUM(r.distance)) travelled_distance FROM 1407_Users u LEFT JOIN 1407_Rides r ON u.id = r.user_id GROUP BY u.`name` ORDER BY travelled_distance DESC, u.`name` ASC; -- 有问题.... -- 这里的 Users 表中可能会出现 id 不同,姓名相同的情况。如果是用的 name 列进行分组,则会将这种情况忽略,视为同一个用户 -- 所以解决办法是对主键分组,主键分组后,由于 id 对应的是 唯一非空的 name 列,所以也是可以查询到的(PS:唯一是肯定的,但是没说一定是非空,这可能就是题目的小缺陷了,亦或者是我对 group by 的理解不够透彻) SELECT u.`name`, IF(ISNULL(SUM(r.distance)),0, SUM(r.distance)) travelled_distance FROM 1407_Users u LEFT JOIN 1407_Rides r ON u.id = r.user_id GROUP BY u.id ORDER BY travelled_distance DESC, u.`name` ASC; -- 看了官网上别人的题解,突然想到怎么把 IFNULL 关键字整忘了,以上 SQL 可以更改为如下所示 SELECT u.`name`, IFNULL(SUM(r.distance), 0) travelled_distance FROM 1407_Users u LEFT JOIN 1407_Rides r ON u.id = r.user_id GROUP BY u.id ORDER BY travelled_distance DESC, u.`name` ASC; -- 总结:在使用 GROUP BY 的时候,在没有别的要求的影响下,尽量使用 主键 进行分组;然后这题需要注意 null 值转 0 的用法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-07-11 05-Nacos注册中心
2022-07-11 04-Ribbon负载均衡
2022-07-11 03-Eureka注册中心
2022-07-11 02-服务拆分和远程调用
2022-07-11 01-微服务的概念