문제

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131123

 

답안코드

더보기
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

시행착오

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FAVORITES DESC

처음 접근했던 풀이 방법이다.

 

뭔가에 홀린듯 이렇게 하면 각 FOOD_TYPE 별로 가장 많은 FAVORITES 가 출력될 것으로 착각했다.

 

위 쿼리가 동작하는 순서는 이렇다.

1. SELECT된 이후에 FAVORITES와 상관없이 테이블의 가장 위쪽부터 FOOD_TYPE으로 GROUP을 나눈다.
2. 그렇게 나눈 데이터에서 FAVORITES 순으로 정렬한다.

 

하지만 위 문제에서 요구하는 것은 다음과 같다.

"SELECT 조회 전에 가장 높은 FAVORITES 별로 GROUP을 나눈 다음 조회하라. 그리고 FOOD_TYPE 순으로 정렬하라"

 

SELECT를 해오는 과정부터, 마지막에 정렬하는 부분까지 전부 틀렸다.

 

그럼 이제 문제에서 요구하는 쿼리를 MySQL의 IN을 사용해 작성해 보겠다.

 

 

3. 문제 해결

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

IN을 이용해서 SELECT 조회 전에 FOOD_TYPE 별로 가장 높은 FAVORITES 정보를 가져왔다.

 

그렇게 가져온 정보는 아래와 같다.

 

그리고 이제 이 정보를 토대로 위 FOOD_TYPE과 FAVORITES에 동시에 일치하는 ROW의 데이터를 조회하면 된다.

 

최종 결과:

 

복사했습니다!