huginn muninn

[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 SQL 본문

코딩테스트

[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 SQL

_maddy 2024. 6. 13. 18:55

 

 

프로그래머스

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

programmers.co.kr

 

 

WITH MAX_REVIEW_COUNT AS (
    SELECT MEMBER_ID
    FROM (
        SELECT MEMBER_ID, COUNT(*) AS REVIEW_COUNT
        FROM REST_REVIEW
        GROUP BY MEMBER_ID
    ) AS REVIEW_COUNT_BY_MEMBER
    WHERE REVIEW_COUNT = (
        SELECT MAX(REVIEW_COUNT)
        FROM (
            SELECT COUNT(*) AS REVIEW_COUNT
            FROM REST_REVIEW
            GROUP BY MEMBER_ID
        ) AS TOTAL_REVIEW_COUNT
    )
)
SELECT
    MEMBER_PROFILE.MEMBER_NAME,
    REST_REVIEW.REVIEW_TEXT,
    DATE_FORMAT(REST_REVIEW.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM
    MAX_REVIEW_COUNT
    LEFT JOIN MEMBER_PROFILE ON MAX_REVIEW_COUNT.MEMBER_ID = MEMBER_PROFILE.MEMBER_ID
    LEFT JOIN REST_REVIEW ON MAX_REVIEW_COUNT.MEMBER_ID = REST_REVIEW.MEMBER_ID
ORDER BY
    REVIEW_DATE ASC,
    REVIEW_TEXT ASC;

 

이 문제에서 내가 유의했던 건, 리뷰를 가장 많이 쓴 사람이 여러 명일수도 있다는 점이었다. 그래서 확인해보니 리뷰를 3개 쓴 사람이 가장 많았고, 리뷰를 3개 쓴 사람은 3명이나 있었다. 그래서 이 사람들을 모두 출력해줘야했다. 

 

그래서 with에서 리뷰 3개 쓴 사람의 아이디를 저장해주었다. 

 


 

 

<코드 개선>

 

코드를 다 짜고나니, with 절에 where에서 너무 복잡해보여서 좀 개선해봤다. 

 

WITH REVIEW_COUNT_BY_MEMBER AS (
    SELECT MEMBER_ID, COUNT(*) AS REVIEW_COUNT
    FROM REST_REVIEW
    GROUP BY MEMBER_ID
),
MAX_REVIEW_COUNT AS (
    SELECT MEMBER_ID
    FROM REVIEW_COUNT_BY_MEMBER
    WHERE REVIEW_COUNT = (SELECT MAX(REVIEW_COUNT) FROM REVIEW_COUNT_BY_MEMBER)
)
SELECT
    MP.MEMBER_NAME,
    RR.REVIEW_TEXT,
    DATE_FORMAT(RR.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM
    MAX_REVIEW_COUNT AS MRC
    JOIN MEMBER_PROFILE AS MP ON MRC.MEMBER_ID = MP.MEMBER_ID
    JOIN REST_REVIEW AS RR ON MRC.MEMBER_ID = RR.MEMBER_ID
ORDER BY
    REVIEW_DATE ASC,
    REVIEW_TEXT ASC;

 

 

 

코드 구현 시 꼭 지키려고 했던 것

  • alias 꼭 as 로 써주기 : 코드 읽는 사람으로 하여금 as 뒤에 이름 써 있는게 더 가독성이 좋음. 
  • 들여쓰기 : 가독성이 좋기 때문에.
  • 대문자 
  • alias 만 봐도 어떤 테이블인지 알도록 이름지어주기 a, a1 이런거 되도록 지양하기.