[STRATASCRATCH] MySQL Coding Problems 러닝포인트 정리

4. Find the top 10 most active users on Facebook Messenger

select a.user, sum(msg_count) 

from (
    select user1 as user, msg_count
    from fb_messages
    UNION ALL
    select user2 as user, msg_count
    from fb_messages
)a

group by 1
order by 2 Desc
Limit 10 ;

UNION ALL vs UNION

  • UNION ALL 은 duplicates 그대로 추출
  • UNION은 duplicates 제거하고 distinct값만 추출 (디폴트)

둘 중 어떤 것을 쓸 지 결정하기 위해 문제에서 중복 제거가 필요한지 체크해야한다.

  • 페이스북 메신저 예제에서는 user 1, user2가 중복되어도 해당 정보 모두 필요하다.
  • union all을 쓴 후 aggregate(group by) 한다.

10. Host Popularity Rental Prices

WITH A AS (

    SELECT 
        distinct concat_ws('-', price, room_type, host_since, zipcode, number_of_reviews) as host_id

        , CASE WHEN number_of_reviews = 0 then 'New' 
                WHEN number_of_reviews between 1 and 5 then 'Rising' 
                WHEN number_of_reviews between 6 and 15 then 'Trending Up' 
                WHEN number_of_reviews between 16 and 40 then 'Popular'
                ELSE 'Hot' END AS host_pop_rating                        

        , price
    FROM airbnb_host_searches 

)

select host_pop_rating, min(price) min_price,  avg(price) avg_price, max(price) max_price
from A
group by 1

WITH CTE AS ( ) SELECT FROM CTE

CONCAT_WS( )

CASE WHEN THEN ELSE END

변수 생성시 자주 사용되는 CASE 문에서 카테고리 대/소문자 확인 잘하기

DISTINCT ≒ GROUP BY

SOLUTION (1)에서는 CTE 2개 생성하여 GROUP BY 를 넣어줬는데, 불필요하게 CTE 중복생성하지 않기

키값이 주어지지 않으면 직접 생성해야하는 케이스도 있다.