SQL/문제풀이

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

응엉잉 2023. 12. 26. 21:43

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

 

프로그래머스

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

programmers.co.kr

 

[1차 코드]

음식 종류별로 가장 즐겨찾기가 많은 식당을 찾기 위해 음식 종류로 GROUP BY 후, favorites column에 대해 MAX 함수를 사용했다.

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

 

이렇게 코드를 작성하는 경우 왜 틀릴까? 를 찾아보니 MAX(favorite) 열은 각 food type 별로 최대 즐겨찾기 건수를 가져오지만, 이 즐겨찾기 건수가 위 출력 결과의 rest_name의 즐겨찾기 건수가 아닐 수 있게 된다고 한다.

food_type으로 GROUP BY 한 후에 가져온 rest_id, rest_name은 MAX(favorite)에 대응하는 값이 아니라, 그냥 특정 food type의 맨 첫번째 row인 것이다.

 

이러한 문제를 해결하기 위해서는 WHERE 절 서브쿼리를 사용해야 한다.

왜냐하면 특정 조건을 만족하는 (이 문제에서는 음식 종류별 '최다 즐겨찾기' 라는 조건) column을 뽑아야 하기 때문이다.

 

쿼리문에서 사용할 조건을 만들어주기 위해, 우선 food_type 별로 최다 즐겨찾기 수를 뽑아보았다.

SELECT food_type, 
    MAX(favorites) AS favorites
FROM rest_info
GROUP BY food_type

 

해당 쿼리를 WHERE 절 서브쿼리로 사용하고자 IN 함수를 함께 사용해주었다.

SELECT food_type, rest_id, rest_name, favorites
FROM rest_info
WHERE (food_type, favorites) IN (
    SELECT food_type, 
    MAX(favorites) AS favorites
    FROM rest_info
    GROUP BY food_type)

 

이때 결과는 음식 종류를 기준으로 내림차순 정렬해달라고 하니, 마지막에 ORDER BY를 붙여주자.

 

[정답 코드]

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

 

[배운점]

그룹별로 어떤 조건을 만족하는 데이터를 뽑고싶을 때 --> 

1. 그룹 + 조건을 뽑아 WHERE 절 서브쿼리로 사용하고

2. IN, NOT IN을 사용하여 조건을 만족하는 데이터만 뽑는다