SQL/프로그래머스 MySQL with code

프로그래머스 MySQL : [lv.3] 즐겨찾기가 가장 많은 식당 정보 출력하기

jamong5 2023. 6. 8. 11:30
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

공개된 SQL 쿼리문들을 몇개 살펴봤는데, 방법이 매우 다양했습니다..!

 

OUTER JOIN 으로 해결하기

방식은 각 행마다 타입이 같고, 즐겨찾기가 더 많은 모든 행들을 다 붙입니다.

붙은게 없는 행이 곧 즐겨찾기가 가장 많은 행이 됩니다.

쿼리문

SELECT r1.food_type, r1.rest_id, r1.rest_name, r1.favorites
FROM REST_INFO r1 LEFT JOIN REST_INFO r2
ON r1.FAVORITES < r2.FAVORITES
AND r1.FOOD_TYPE = r2.FOOD_TYPE
WHERE r2.REST_ID IS NULL
ORDER BY r1.FOOD_TYPE DESC

 

WHERE절 서브쿼리(Nested Subquery) 로 해결하기

타입별로 즐겨찾기 max 값을 뽑은 후 타입,즐겨찾기 조합이 같은 행들을 뽑아냅니다. 가장 직관적이지 않을까 싶습니다.

쿼리문

SELECT food_type, rest_id, rest_name, favorites
FROM rest_info
WHERE (
    (food_type,favorites) in (SELECT food_type, MAX(favorites) FROM rest_info
               GROUP BY food_type)
    )
ORDER BY food_type DESC

 

FROM절 서브쿼리(inline views), PARTITION 과 ROW_NUMBER 로 해결하기

타입으로 partition 을 수행하면서 즐겨찾기 높은 순으로 정렬하고, row_number 로 행번호를 달아줍니다. 파티션을 수행한 행 번호가 파티션별로 따로 달린다는걸 이용합니다.

각 파티션별 가장 위의 레코드 (1번행) 가 즐찾 수가 가장 많은 레코드가 됩니다.

쿼리문

SELECT food_type, rest_id, rest_name, favorites
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY food_type ORDER BY favorites DESC) AS rn
    FROM rest_info
) rest_info
WHERE rn = 1
ORDER BY food_type desc