💻 Coding/[Algorithm]SQL

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

🩷 민영 2024. 11. 1. 18:08

🗒️ 문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

💡조건

## REST_INFO : 식당 정보

# 음식종류별로 즐겨찾기수가 가장 많은 식당 -> 음식 종류, id, 식당이름, 즐겨찾기수 조회
# 음식 종류 내림차순 DESC

 

✏️ 내 코드

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC

 

✏️ 수정한 코드

SELECT T1.FOOD_TYPE, T1.REST_ID, T1.REST_NAME, T1.FAVORITES
FROM REST_INFO T1
JOIN (SELECT FOOD_TYPE, MAX(FAVORITES) AS T2_MAX
     FROM REST_INFO
     GROUP BY FOOD_TYPE) T2
ON T1.FOOD_TYPE = T2.FOOD_TYPE AND T1.FAVORITES = T2.T2_MAX
ORDER BY FOOD_TYPE DESC

 

📒GROUP BY에서 MAX/MIN 사용하기

첫번째 코드에서 제대로 결과가 나오지 않은 이유는 GROUP BY와 MAX를 함께 사용했기 떄문이다.

 

GROUP BY를 사용하여 각 FOOD_TYPE 별로 하나의 행을 반환하게 되는데 이때 REST_ID와 REST_NAME이 단일한 값이 아닌 경우로 문제가 생긴다.

SELECT FOOD_TYPE, MAX(FAVORITES) AS T2_MAX
FROM REST_INFO
GROUP BY FOOD_TYPE

 

- REST_INFO 테이블에서 FOOD_TYPE 별로 FAVORITES의 최대값을 구한다

- GROUP BY FOOD_TYPE 을 통해 음식 종류별로 그룹 -> MAX(FAVORITES)를 통해 각 음식 종류에서 가장 큰 'FAVORITES'값을 선택

- 해당 쿼리를 통해 T2 테이블에서 각 음식 종류별로 최고 인기도 'FAVORITES'를 가진 값을 담고 있다.

 

SELECT T1.FOOD_TYPE, T1.REST_ID, T1.REST_NAME, T1.FAVORITES
FROM REST_INFO T1
JOIN (서브쿼리 T2) ON 조건
ORDER BY FOOD_TYPE DESC

- T1과 T2를 조인하여 각 음식 종류별로 가장 높은 FAVORITES 값을 가진 레코드만 선택하게 된다.

 

 

 

😊 오늘의 후기

GROUP UP에서 집계되지 않은 컬럼을 함께 선택하려면 서브쿼리나 조인을 사용해서 조건에 맞는 특정 행을 새롭게 선택해야한다는 사실을 알게 되었다.