SQL 쿼리 연습/GROUP BY

[Lv.3 / 프로그래머스 / SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기

김세진 2023. 3. 2. 23:31
반응형

 

 

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이 (MySQL)

 

FOOD_TYPE별로 FAVORITES가 가장 높은 식당의 ID와 NAME을 함께 출력해야 한다.

필자는 FOOD_TYPE별 가장 높은 FAVORITES를 추린 뒤, WHERE절에서 비교하여 가져오는 방식으로 해결했다.

 

 

Implicit Join

SELECT
    A.FOOD_TYPE
    , REST_ID
    , REST_NAME
    , FAVORITES
FROM
    REST_INFO AS A
    , (
        SELECT
            FOOD_TYPE
            , MAX(FAVORITES) AS MAX_FAVORITES
        FROM
            REST_INFO
        GROUP BY
            FOOD_TYPE
    ) AS B
WHERE
    A.FOOD_TYPE = B.FOOD_TYPE
    AND A.FAVORITES = B.MAX_FAVORITES
GROUP BY
    FOOD_TYPE
ORDER BY
    FOOD_TYPE DESC

 

위 코드는 처음 작성한 코드로, 조금 알아보니 "Implicit Join" 또는 "Old Style Join" 방식이라고 한다. FROM절에 여러 개의 테이블을 명시하고 WHERE 절에 JOIN 조건을 작성하는 방식을 일컫는다.

 

이같은 방식은 JOIN 구문을 사용할 때와 비교하여 효율성 면에선 크게 차이가 나지는 않는다고 한다. 단, 어떤 테이블끼리 조인 관계에 놓였는지 명확하게 명시되지 않아 가독성이 떨어지기 때문에 권장되지는 않는 방식이라고 한다. 따라서 JOIN 구문을 사용하여 아래와 같이 작성하는 것이 보다 바람직하다고 할 수 있겠다.

 

 

Explicit Join

SELECT
    A.FOOD_TYPE
    , A.REST_ID
    , A.REST_NAME
    , A.FAVORITES
FROM
    REST_INFO AS A
INNER JOIN
    (
        SELECT
            FOOD_TYPE
            , MAX(FAVORITES) AS MAX_FAVORITES
        FROM
            REST_INFO
        GROUP BY
            FOOD_TYPE
    ) AS B
ON
    A.FOOD_TYPE = B.FOOD_TYPE
    AND A.FAVORITES = B.MAX_FAVORITES
ORDER BY
    FOOD_TYPE DESC;

 

 

 

 

반응형