MEMBER_PROFILE와 REST_REVIEW 테이블에서
리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요.
회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고,
결과는 리뷰 작성일을 기준으로 오름차순,
리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, "%Y-%m-%d")
FROM MEMBER_PROFILE I JOIN REST_REVIEW R ON I.MEMBER_ID=R.MEMBER_ID
WHERE I.MEMBER_ID=(SELECT MEMBER_ID
FROM REST_REVIEW R
GROUP BY MEMBER_ID
ORDER BY COUNT(*) DESC
LIMIT 1)
ORDER BY REVIEW_DATE, REVIEW_TEXT;
SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, "%Y-%m-%d")
FROM MEMBER_PROFILE I JOIN REST_REVIEW R ON I.MEMBER_ID=R.MEMBER_ID
WHERE I.MEMBER_ID IN (SELECT MEMBER_ID
FROM REST_REVIEW R
GROUP BY MEMBER_ID
HAVING COUNT(*)=(SELECT MAX(COUNTS)
FROM (SELECT COUNT(*) AS COUNTS
FROM REST_REVIEW
GROUP BY MEMBER_ID) AS C))
ORDER BY REVIEW_DATE, REVIEW_TEXT;
풀 당시에는 첫 번째 코드로 제출해서 맞았다.
하지만 제일 비싼 식품의 정보 출력하기 때도 그랬지만, 조건을 만족하는 사람이 여러 명일 경우가 있기 때문에 LIMIT 1로 한 명에 대해서만 출력하는 것을 틀린 풀이라고 생각했다.
아래의 수정된 코드는 MAX(COUNT(*))를 사용하지 못해서 무려 3중의 중첩 쿼리를 사용한 방식이다.
MEMBER_ID로 Grouping을 하고, group별로 개수를 세었을 때(COUNT(*)),
가장 튜플 개수가 많은 그룹의 MEMBER_ID를 return한다.
이 때, MAX(COUNT(*))를 사용할 수 없고,
SELECT절보다 HAVING절에 먼저 수행되기 때문에
SELECT COUNT(*) AS CNT
(...)
HAVING MAX(CNT)
와 같이 SQL문을 구성할 수가 없다. 그래서 두 번째 서브 쿼리를 사용한다.
위와 같은 과정을 거쳐서 수정된 코드가 탄생했다.
그런데 신기한 점은, 제출 했던 코드와 수정된 코드의 출력 내용이 달랐다. 그런데 둘 다 정답이었다.
프로그래머스의 채점 시스템 때문인지, 내가 모르는 무언가가 있는지 잘 모르겠다.