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


답
◽ 서브쿼리 사용
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
- HAVING 절에 MAX(FAVORITES)을 했으나, 정확한 필터링이 되지 않았다.
올바른 문법은
MAX(FAVORITES) = 어떤 값
으로비교
연산자를 사용해야 한다.
◽ 과정 2 👉 성공(서브쿼리)
음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회
HAVING을 사용하지 않고, 각 음식 종류 별 즐겨찾기 수가 가장 많은 식당에 대해 서브쿼리로 1번 필터링을 하는 것이다.
IN
을 통해 각FOOD_TYPE
과MAX(FAVORITES)
데이터가 필터링 된 값에 해당되는 FOOD_TYPE과 FAVORITES를 추출한다.
WHERE (FOOD_TYPE, FAVORITES) IN ( SELECT FOOD_TYPE, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE )
필터링 된
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


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