중첩 서브쿼리로 조건에 맞는 행을 필터링하는 문제다.

 

필요 정보

-- KEY 값은 MEMEBER_ID
-- 어떤 JOIN을 사용해야 할까?: 리뷰를 작성한 회원만 확인할 수 있도록 INNER JOIN
-- 서브쿼리로 가장 많은 리뷰를 적은 MEMBER_ID 파악
-- WHERE를 사용해서 MEMBER_ID가 일치하는 행의 NAME, TEXT, DATE 도출

첫번째 서브쿼리

리뷰 데이터 테이블에 있는 멤버 아이디 별 리뷰 개수 구하기

SELECT
    MEMBER_ID, COUNT(*) AS CNT
FROM REST_REVIEW
GROUP BY MEMBER_ID

아이디별 리뷰 개수

두번째 서브쿼리

최대 리뷰 개수 구하기

SELECT
    MAX(CNT)
FROM
(SELECT
    MEMBER_ID, COUNT(*) AS CNT
FROM REST_REVIEW
GROUP BY MEMBER_ID) AS T

최대 리뷰 개수

세번째 서브쿼리

최대 리뷰 개수와 동일한 리뷰를 작성한 MEMBER_ID 찾기

SELECT
    MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
HAVING COUNT(MEMBER_ID) =  # MEMBER_ID가 MAX(CNT)와 동일한 것만 추출한다.
(SELECT
    MAX(CNT)
FROM
(SELECT
    MEMBER_ID, COUNT(*) AS CNT
FROM REST_REVIEW
GROUP BY MEMBER_ID) AS T)

최대 리뷰 개수와 동일한 리뷰 개수를 가진 MEMBER_ID

네번째 서브쿼리

위에서 구한 MEMBER_ID와 동일한 MEMBER_ID들의 고객명, 리뷰 텍스트, 날짜 구하기

SELECT
    MP.MEMBER_NAME,
    RR.REVIEW_TEXT,
    DATE_FORMAT(RR.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM MEMBER_PROFILE AS MP
JOIN REST_REVIEW AS RR
ON MP.MEMBER_ID = RR.MEMBER_ID
WHERE RR.MEMBER_ID IN
(SELECT
    MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
HAVING COUNT(MEMBER_ID) =
(SELECT
    MAX(CNT)
FROM
(SELECT
    MEMBER_ID, COUNT(*) AS CNT
FROM REST_REVIEW
GROUP BY MEMBER_ID) AS T))
ORDER BY REVIEW_DATE, REVIEW_TEXT

최종 실행 결과

+ Recent posts