728x90
📚문제
📝풀이
# 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