[프로그래머스] Lv.3 즐겨찾기가 가장 많은 식당 정보 출력하기 (서브쿼리, GROUP BY)

[프로그래머스] Lv.3 즐겨찾기가 가장 많은 식당 정보 출력하기 (서브쿼리, GROUP BY)
muaga's avatar
May 20, 2024
[프로그래머스] Lv.3 즐겨찾기가 가장 많은 식당 정보 출력하기 (서브쿼리, GROUP BY)
 
notion image
notion image
 


◽ 서브쿼리 사용

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
 

풀이


◽ 과정 1 👉 실패

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE ⚠️ HAVING MAX(FAVORITES) ORDER BY FOOD_TYPE DESC
  1. HAVING 절에 MAX(FAVORITES)을 했으나, 정확한 필터링이 되지 않았다. 올바른 문법은 MAX(FAVORITES) = 어떤 값 으로 비교 연산자를 사용해야 한다.
 

◽ 과정 2 👉 성공(서브쿼리)

음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회
HAVING을 사용하지 않고, 각 음식 종류 별 즐겨찾기 수가 가장 많은 식당에 대해 서브쿼리로 1번 필터링을 하는 것이다.
 
  1. IN을 통해 각 FOOD_TYPEMAX(FAVORITES) 데이터가 필터링 된 값에 해당되는 FOOD_TYPE과 FAVORITES를 추출한다.
WHERE (FOOD_TYPE, FAVORITES) IN ( SELECT FOOD_TYPE, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE )
 
  1. 필터링 된 FOOD_TYPE, FAVORITES에 대해 조회할 컬럼을 SELECT 절에 작성한다.
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
 

❔ 다른 쿼리와 같은 결과 값의 차이

답으로 작성한 쿼리와 아래의 쿼리의 결과가 동일하게 나왔다. 그래서 간단한 쿼리인 아래의 쿼리를 사용해 채점을 했지만, 틀렸다고 했다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE ORDER BY FOOD_TYPE DESC
답
위의 쿼리
위의 쿼리
쿼리의 목적은 같으나, 접근 방식과 결과가 다르다고 한다.
 
답의 동작방식
  1. 서브쿼리 : FOOD_TYPE 별로 MAX(FAVORITES) 값을 찾는 1차 필터링을 거친다.
  1. 메인쿼리 : 1차 필터링 된 (FOOD_TYPE. FAVORITES) 결과와 일치한 레코드를 선택한다.
➡️ 각 FOOD_TYPE 별로, FAVORITES가 최대 값인 레코드만 반환한다.
 
위의 쿼리의 동작방식
  1. FOOD_TYPE 별로 그룹화한다.
  1. 각 그룹에서 MAX(FAVORITES)값을 계산한다.
  1. 위의 두 컬럼 외의 그룹화되지 않은 컬럼들을 포함하고 있어 SQL 표준에 맞지 않다.
➡️ 표준에 맞더라도 위의 쿼리는 FOOD_TYPE 별로 그룹화 된 결과에서 최대 FAVORITES 값을 포함하는 각 그룹의 하나의 레코드를 반환한다. 하지만 위의 쿼리는 에러를 발생할 가능성이 크다!
Share article

muaga's Hub