코딩테스트/SQL

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

_알파카 2024. 7. 30. 18:11
728x90

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/131123

 

프로그래머스

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

programmers.co.kr

 

내 풀이

풀이 1

WITH w1 AS (
    SELECT REST_ID
            , RANK() OVER(PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS ranking
    FROM REST_INFO
)
SELECT i.FOOD_TYPE, i.REST_ID, i.REST_NAME, i.FAVORITES
FROM REST_INFO i INNER JOIN w1
ON i.REST_ID = w1.REST_ID
WHERE w1.ranking = 1
ORDER BY i.FOOD_TYPE DESC;

 

RANK 함수(윈도우 함수)와 CTE를 사용한 풀이이다. 

 

풀이 2

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;

 

WHERE 절에 서브쿼리를 사용한 풀이이다. 

 

처음에는 서브쿼리를 아래와 같이 사용했는데, 이는 정확한 값이 도출되지 않는다. 

# 틀린 풀이
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (REST_ID, FAVORITES) IN (
    SELECT REST_ID, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;

 

왜냐하면 WHERE 절에서 FOOD_TYPE을 통해 GROUP BY를 하였지만, 

SELECT로는 food_type을 뽑아내지 않기 때문이다. 

이는 각 food_type 별로 여러 rest_id가 있을 수 있으므로, 

rest_id를 그룹화된 열에 포함시키면 논리적으로 맞지 않는다. 

 

GROUP BY와 SELECT의 조합을 항상 유의하고 사용해야겠다. 

 

 

728x90