노력에는 지름길이 없으니까요

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

SQL/프로그래머스

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

데건 2024. 7. 15. 10:33
728x90

 

해결일 언어 레벨 테스트명
20240715 SQL level 4  그룹별 조건에 맞는 식당 목록 출력하기

 

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131124

 

 


 

내 코드

SELECT
    MEMBER_NAME
    ,REVIEW_TEXT
    ,DATE_FORMAT(REVIEW_DATE,'%Y-%m-%d') REVIEW_DATE
FROM REST_REVIEW
JOIN MEMBER_PROFILE 
USING (MEMBER_ID) 
# 2. 개수가 MAX 개수인 모든 MEMBER_ID를 구하는 서브쿼리
WHERE MEMBER_ID IN (SELECT MEMBER_ID
                    FROM REST_REVIEW
                    GROUP BY MEMBER_ID
                    # 1. MAX 개수를 구하는 서브쿼리
                    HAVING COUNT(REVIEW_ID) = (SELECT COUNT(REVIEW_ID) CNT 
                                                FROM REST_REVIEW
                                                GROUP BY MEMBER_ID
                                                ORDER BY COUNT(REVIEW_ID) DESC
                                                LIMIT 1))
ORDER BY 3,2

 

 

1. 서브쿼리에서 구할 수 있는 MAX 개수는 3

2. 따라서 포스트 수가 3개인 모든 MEMBER에 대한 글을 출력하면 된다.

 

에러 없이 한 번에 풀려서 기분 좋다 ㅎㅎ

 

개선점:

MAX를 구하는 방식에서 나는 DESC LIMIT1을 사용하는 다소 번거로운 방법을 썼는데,

그냥 MAX 함수를 쓰면 될 일이다...

 

베스트 코드

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;

 

 

 

728x90
반응형