본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Movie Rating

by kime2 2024. 7. 10.
출처

문제

가장 많은 수의 영화를 평가한 사용자의 이름을 찾습니다. 동률인 경우 사전순으로 더 작은 사용자 이름을 반환합니다.
에서 평균 평점이 가장 높은 영화 이름을 찾습니다. 동점인 경우 사전순으로 더 작은 영화 이름을 반환합니다.February 2020

문제에 대한 해석

1. user테이블과 MovieRating테이블을 통해 가장 많이 평가한 평론가 찾기 2. movies테이블과 MovieRating테이블을 활용하서 해당월의 평균평점이 가장 높은 영화 찾기 답 : 1과 2를 한 컬럼에 나타내기

 

 

풀이(MYSQL)

-- 1. 가장 많은 수의 영화를 평가한 사람들 > 알파벳순으로 작은것 : 오름차순의 첫번째
with user_cnt as (
    select u.user_id
    , u.name
    , count(m.rating) as 'cnt'
    from Users u join MovieRating m
    on u.user_id = m.user_id
    group by u.user_id,u.name
),
names as(
    select name 
    from user_cnt 
    where cnt = (select max(cnt)
    from user_cnt)
    order by name
    limit 1
),
-- 2. 2020년 1월에 평가한 영화중 평균 평점이 가장 높은 것 > 알파벳순으로 작은것 : 오름차순의 첫번째
rating as (
    select m.movie_id, m.title , avg(mr.rating) as 'rate'
    from MovieRating mr join Movies m
    on mr.movie_id = m.movie_id
    where year(mr.created_at) = 2020
    and month(mr.created_at) = 2
    group by m.movie_id, m.title 
),
 titles as (
    select title 
    from rating
    where rate = (select max(rate)
                    from rating)
    order by title
    limit 1
 )
 -- 3. 1에서 구했던 평론가와 2에서 구했던 영화명을 results라는 컬럼으로 합치기
select name as 'results'
from names
union all
select title as 'results'
from titles

 

오답 : union과 union all

1. union사용시 오답

daniel이라는 평론가와 frozen2라는 영화가 출력되어 정답
다른 테스트에서는 rebeca만 출력됨 > 평론가와 영화명이 동일해서 중복제거가 되는 상황

 

다른사람 풀이

(SELECT name AS results
FROM MovieRating JOIN Users USING(user_id)
GROUP BY name
ORDER BY COUNT(*) DESC, name
LIMIT 1)

UNION ALL

(SELECT title AS results
FROM MovieRating JOIN Movies USING(movie_id)
WHERE EXTRACT(YEAR_MONTH FROM created_at) = 202002
GROUP BY title
ORDER BY AVG(rating) DESC, title
LIMIT 1);

쿼리요약

1. 가장 많은 수의 영화를 평가한 사람들 > 알파벳순으로 작은것 : 오름차순의 첫번째
with user_cnt as (
    select u.user_id
    , u.name
    , count(m.rating) as 'cnt'
    from Users u join MovieRating m
    on u.user_id = m.user_id
    group by u.user_id,u.name
),
names as(
    select name
    from user_cnt
    where cnt = (select max(cnt)
    from user_cnt)
    order by name
    limit 1
)
select name as'results'
from names
SELECT name AS results
FROM MovieRating JOIN Users USING(user_id)
GROUP BY name
ORDER BY COUNT(*) DESC, name
LIMIT 1
조회 : 사람의 이름(name)
조건 : 평가를 가장 많이 한


1. 2020년 1월에 평가한 영화중 평균 평점이 가장 높은 것 > 알파벳순으로 작은것 : 오름차순의 첫번째
rating as (
    select m.movie_id, m.title , avg(mr.rating) as 'rate'
    from MovieRating mr join Movies m
    on mr.movie_id = m.movie_id
    where year(mr.created_at) = 2020
    and month(mr.created_at) = 2
    group by m.movie_id, m.title
),
 titles as (
    select title
    from rating
    where rate = (select max(rate)
                    from rating)
    order by title
    limit 1
 )
select title
from titles
SELECT title AS results
FROM MovieRating JOIN Movies USING(movie_id)
WHERE EXTRACT(YEAR_MONTH FROM created_at) = 202002
GROUP BY title
ORDER BY AVG(rating) DESC, title
LIMIT 1
조회 : 영화명(title)
조건 : 2020년 2월 평균 평가가 가장 높음

배운점

  • EXTRACT( unit FROM data(컬럼명) ) : 날짜데이터에서 년, 월, 일, 시간 등을 추출
  • 예) EXTRACT(YEAR_MONTH FROM created_at) = 202002

 

  • union 사용시 주의
  • 쿼리를 구분하는 소괄호를 하지 않으면 에러가 날 수 있다