코딩테스트/SQL 문제풀이

[MySQL/Oracle] 즐겨찾기가 가장 많은 식당 정보 출력하기

지과쌤 2022. 11. 17.
반응형

목차

    문제

    문제 설명

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

    Column nameTypeNullable
    REST_ID VARCHAR(5) FALSE
    REST_NAME VARCHAR(50) FALSE
    FOOD_TYPE VARCHAR(20) TRUE
    VIEWS NUMBER TRUE
    FAVORITES NUMBER TRUE
    PARKING_LOT VARCHAR(1) TRUE
    ADDRESS VARCHAR(100) TRUE
    TEL VARCHAR(100) TRUE

    문제

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


    예시

    REST_INFO 테이블이 다음과 같을 때

    REST_IDREST_NAMEFOOD_TYPEVIEWSFAVORITESPARKING_LOTADDRESSTEL
    00001 은돼지식당 한식 1150345 734 N 서울특별시 중구 다산로 149 010-4484-8751
    00002 하이가쯔네 일식 120034 112 N 서울시 중구 신당동 375-21 NULL
    00003 따띠따띠뜨 양식 1234023 102 N 서울시 강남구 신사동 627-3 1F 02-6397-1023
    00004 스시사카우스 일식 1522074 230 N 서울시 서울시 강남구 신사동 627-27 010-9394-2554
    00005 코슌스 일식 15301 123 N 서울특별시 강남구 언주로153길 010-1315-8729

    SQL을 실행하면 다음과 같이 출력되어야 합니다.

    FOOD_TYPEREST_IDREST_NAMEFAVORITES
    한식 00001 은돼지식당 734
    일식 00004 스시사카우스 230
    양식 00003 따띠따띠뜨 102

    풀이

    --MySQL
    select
         RI.FOOD_TYPE
        ,RI.REST_ID
        ,RI.REST_NAME
        ,maxFavorites.MAX_FAVORITES
        from REST_INFO as RI
        inner join (select
                         FOOD_TYPE
                        ,max(FAVORITES) as MAX_FAVORITES
                        from REST_INFO
                        group by FOOD_TYPE) as maxFavorites
            on RI.FOOD_TYPE = maxFavorites.FOOD_TYPE
                and RI.FAVORITES = maxFavorites.MAX_FAVORITES
        group by RI.FOOD_TYPE
        order by RI.FOOD_TYPE desc
    
    --Oracle
    select 
         RI1.FOOD_TYPE
        ,RI1.REST_ID
        ,RI1.REST_NAME
        ,RI2.FAVORITES
        from REST_INFO RI1
        inner join (select 
                         FOOD_TYPE
                        ,max(FAVORITES) as "FAVORITES"
                        from REST_INFO
                        group by FOOD_TYPE) RI2
            on (RI1.FOOD_TYPE = RI2.FOOD_TYPE
                and RI1.FAVORITES = RI2.FAVORITES)
        order by RI1.FOOD_TYPE desc

     

    참고(GROUP BY 참고해야될 점)

    select
    	 FOOD_TYPE
    	,REST_ID
    	,REST_NAME
    	,max(FAVORITES) as FAVORITES
    	from REST_INFO
    	group by FOOD_TYPE
    	order by FOOD_TYPE desc

    위 쿼리가 틀린 이유.

     

    위 쿼리의 경우, group by 를 food_type 으로 했을 때, rest_id, rest_name 이 max(favorites) 인 row인지 정확히 알 수 없다. 

    왜냐하면, group by 를 food_type 으로 했을 때, max(favorites)값은 정확이 내가 원하는 food_type의 favorites라고 확신할 수 있지만, rest_id, rest_name은 group by로 묶여질 때, 제일 첫번째 row가 가져와지기 때문에, max(favorites)의 rest_id, rest_name과 일치하지 않을 수도 있다.

     

    관련 내용은 다음 포스트에 남겨두었다.

    https://earthteacher.tistory.com/204

     

    [MySQL/SQL] Server SQL Modes - "Group By" 를 사용할 때, 알아야 할 내용

    목차 시작하며 https://earthteacher.tistory.com/203 [MySQL/Oracle] 즐겨찾기가 가장 많은 식당 정보 출력하기 목차 문제 문제 설명 다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과

    earthteacher.tistory.com

     

    반응형

    댓글

    💲 추천 글