
문제
문제 링크: 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의 데이터를 조회하면 된다.
최종 결과: