Image

Easy 🔗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 테이블의 idRides 테이블의 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

댓글남기기