[LeetCode][MySQL] 1407. Top Travellers
📝문제 요약
Table: Users
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id is the column with unique values for this table.
name is the name of the user.
Table: Rides
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| user_id | int |
| distance | int |
+---------------+---------+
id is the column with unique values for this table.
user_id is the id of the user who traveled the distance "distance".
Write a solution to report the distance traveled by each user.
Return the result table ordered by travelled_distance
in descending order, if two or more users traveled the same distance, order them by their name
in ascending order.
The result format is in the following example.
Example 1:
Input:
Users table:
+------+-----------+
| id | name |
+------+-----------+
| 1 | Alice |
| 2 | Bob |
| 3 | Alex |
| 4 | Donald |
| 7 | Lee |
| 13 | Jonathan |
| 19 | Elvis |
+------+-----------+
Rides table:
+------+----------+----------+
| id | user_id | distance |
+------+----------+----------+
| 1 | 1 | 120 |
| 2 | 2 | 317 |
| 3 | 3 | 222 |
| 4 | 7 | 100 |
| 5 | 13 | 312 |
| 6 | 19 | 50 |
| 7 | 7 | 120 |
| 8 | 19 | 400 |
| 9 | 7 | 230 |
+------+----------+----------+
Output:
+----------+--------------------+
| name | travelled_distance |
+----------+--------------------+
| Elvis | 450 |
| Lee | 450 |
| Bob | 317 |
| Jonathan | 312 |
| Alex | 222 |
| Alice | 120 |
| Donald | 0 |
+----------+--------------------+
Explanation:
Elvis and Lee traveled 450 miles, Elvis is the top traveler as his name is alphabetically smaller than Lee.
Bob, Jonathan, Alex, and Alice have only one ride and we just order them by the total distances of the ride.
Donald did not have any rides, the distance traveled by him is 0.
✏️문제 풀이
SELECT
SELECT u.name, IFNULL(SUM(r.distance), 0) AS travelled_distance
name
: 사용자 이름travelled_distance
: 총 이동거리- 일단 각 사용자별 총 이동거리를
SUM(r.distance)
로 구함 - 이동하지 않은 사용자의 경우 이동거리가 null 값이 나오기 때문에
IFNULL
을 사용하여 null 값을 0으로 대체
- 일단 각 사용자별 총 이동거리를
FROM
FROM Users u
LEFT JOIN Rides r
ON u.id = r.user_id
- 이동하지 않는 사용자의 경우에도 데이터는 있어야 하므로
LEFT JOIN
을 사용하여 이동 거리가 없다면 NULL로 나올 수 있게 함 Users
테이블의id
와Rides
테이블의user_id
가 외래키
GROUP BY
GROUP BY u.id
- 처음에
name
으로 그룹화를 했는데, 이럴경우 동명이인이 있는 케이스에 틀리게 됨 - 그러므로 사용자의 고유한
id
값을 기준으로 그룹화
ORDER BY
ORDER BY travelled_distance DESC, name
travelled_distance
를 기준으로 내림차순 정렬하고travelled_distance
의 값이 같을 경우에는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 travelled_distance DESC, name
댓글남기기