본문 바로가기
Programming/SQL

[프로그래머스 SQL] 즐겨찾기가 가장 많은 식당 출력하기

by 용스토리랜드 2024. 7. 4.

✅문제 설명

다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_IDREST_NAMEFOOD_TYPEVIEWSFAVORITESPARKING_LOTADDRESSTEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

 

✅ REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

 

✅처음 내가 작성한 코드 (오답)

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

 

내가 작성한 코드가 음식종류별 (FOOD_TYPE) 별 즐겨찾기가 가장 많은 식당이니 GROUP BY로 묶어주고 GROUP 중에 MAX(FAVRORITES) 인 행을 추출하는 코드라고 생각했다. 하지만, 착각이었습니다... ㅎㅎ

 

다른 컬럼들은 GROUP 을 묶어준 상태에서 가장 상단의 행을 가져왔고, MAX(FAVORITES) 값만 그룹중에 가장 MAX 인 FAVORITES;즐겨찾기수 를 가져왔습니다. 이게 무슨말이냐면

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

 

이 코드를 실행해서 봤을 때, 

 

중식은 행이 1개 밖에 없었음.

여기서 볼 수 있듯이 각 FOOD_TYPE 별로 가장 즐겨찾기 수가 많은 데이터들은 아래와 같다

 

분식, 애플우스, 151

양식, 따띠따띠뜨, 102

일식, 스시사카우스, 230

한식, 은돼지식당, 734

중식, 만정, 20

 

이렇게 나와야 하는데 위에서 내가 돌린 코드의 결과는,, 아래와 같다. 일식의 경우에 230 은 맞지만 하이가쯔네..?가 나왔다. 

 

만약, FOOD_TYPE 별로 MAX(FAVORITES) 를 추출하는 것이었으면 정답이 될 수도 있지만, 다른 컬럼들은 GROUP BY 로 묶였을 때, 임의로 제일 위의 값이 선택되어 추출되었기 때문이다. 

 

따라서, 정답을 내기 위해서는 SUBQUERY 가 필요했는데, 

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. 먼저, SUBQUERY 를 통해서 FOOD_TYPE 별로 MAX(FAVORITES) 값을 가진 테이블을 생성한다. 

2. WHERE 절에 (FOOD_TYPE, FAVORITES) 를 명시해주고 이 값들이 SUBQUERY 를 통해서 나온 값을 가지는 행을 필터링한다 ! 

3. SELECT 문에서 필요한 컬럼 명들을 명시해줘서 WHERE 절을 만족하는 행들을 추출한다. 

4. 마지막으로 FOOD_TYPE 내림차순 정렬을 해준다 !

 

내부 (서브쿼리) 쿼리를 돌려서 나온 테이블

 

다른 컬럼들과 함께 출력될 때는 집계함수를 사용하는 컬럼은 GROUP BY의 영향을 받지만 다른 행들은 받지 않는 다는 것을 알게 되었음.
따라서 다른 컬럼들과 함께 추출을 원할 때는 서브쿼리와 같이 GROUP BY 를 통해서 WHERE 절에 사용할 조건을 만들어 외부 쿼리를 통해 다시 추출해야 함.
반응형