본문 바로가기

SQL/LeetCode

LeetCode / 1341. Movie Rating / MySQL(Medium) / Subquery

728x90

📚문제

출처 : LeetCode(https://leetcode.com/problems/movie-rating/)


📝풀이

# Write your MySQL query statement below
SELECT MIN(result) AS results
FROM (
    SELECT u.name AS result
    FROM MovieRating r
    INNER JOIN Users u ON r.user_id = u.user_id
    GROUP BY u.name
    ORDER BY COUNT(*) DESC, u.name
    LIMIT 1) AS names

UNION ALL

SELECT MIN(result) AS results
FROM (
    SELECT m.title AS result
    FROM MovieRating r
    INNER JOIN Movies m ON r.movie_id = m.movie_id 
    WHERE LEFT(created_at,7) = '2020-02'
    GROUP BY m.title
    ORDER BY AVG(r.rating) DESC, m.title
    LIMIT 1) AS movies

 

FROM절 서브쿼리를 이용하면 쉽게 풀 수 있다

 

테이블에서 LIMIT를 걸어주고 

FROM절 밖의 SELECT에서 MIN값을 취해주어야 하는 것만 유의하자

 

그리고 한가지 더 

어차피 MIN값을 취해주는 거면 LIMIT1을 걸지 않아도 되는거 아닌가 ?

라는 생각이 들어서 직접 실행해봤다

 

예를 들어서 위 쿼리 중

영화를 가장 많이 본 사람의 이름을 구하는 쿼리에서

SELECT *
FROM (
    SELECT u.name AS result
    FROM MovieRating r
    INNER JOIN Users u ON r.user_id = u.user_id
    GROUP BY u.name
    ORDER BY COUNT(*) DESC, u.name) AS names
 ----------------------------------------------
 {"headers": ["result"], "values": [["Daniel"], ["Monica"], ["Maria"], ["James"]]}

LIMIT 조건을 사용하지 않는다면 이렇게 나오고

여기서 MIN값을 취해준다면 원래 정답인 Daniel과 동일하게 나올 것이다

그래서 LIMIT가 필요없어보일 수도 있다

 

근데 만약 이 쿼리에서

James가 영화를 제일 많이보고 Daniel이 영화를 제일 적게 봤다면

James -> Monica -> Maria -> Daniel순으로 나오게 되고

여기에 Min값을 취한다면 알파벳 순서인 Daniel을 값으로 반환하게 되기 때문에

틀리게 된다

 

그렇기 때문에 서브쿼리 내에서 LIMIT1로 제한을 해준 다음에(James)

MIN값을 반환해야 하는 것이다

 

 

+ 그리고 UNION을 하게되면 틀리게 된다 

   영화 이름과 사람이름이 같은 경우가 있어서...📽️🎞️

728x90