[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
댓글남기기