코딩테스트
[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 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 이런거 되도록 지양하기.