프로그래머스 SQL 고득점 킷 그룹별 조건에 맞는 식당 목록 출력하기

hysss·2023년 2월 17일
0

JOIN - 그룹별 조건에 맞는 식당 목록 출력하기

문제 분석

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중의 중첩 쿼리를 사용한 방식이다.

  1. 가장 외부의 쿼리(Outer query): 리뷰의 개수가 가장 많은 MEMBER의 ID를 가져오기 위해서 서브 쿼리를 사용한다.
  2. 첫 번째 서브 쿼리:
    • MEMBER_ID로 Grouping을 하고, group별로 개수를 세었을 때(COUNT(*)),
      가장 튜플 개수가 많은 그룹의 MEMBER_ID를 return한다.

    • 이 때, MAX(COUNT(*))를 사용할 수 없고,
      SELECT절보다 HAVING절에 먼저 수행되기 때문에

      SELECT COUNT(*) AS CNT
       (...)
       HAVING MAX(CNT)

      와 같이 SQL문을 구성할 수가 없다. 그래서 두 번째 서브 쿼리를 사용한다.

  3. 두 번째 서브 쿼리:
    • 마찬가지로 MAX(COUNT(*))를 사용할 수가 없다.
      그래서 FROM절에서 세 번째 서브 쿼리를 사용해서 COUNT(*)을 컬럼으로 가진 테이블을 가져온다.
  4. 세 번째 서브 쿼리: COUNT(*)에 COUNTS라는 이름을 붙여서 컬럼으로 추가한 테이블을 가져온다.

위와 같은 과정을 거쳐서 수정된 코드가 탄생했다.
그런데 신기한 점은, 제출 했던 코드와 수정된 코드의 출력 내용이 달랐다. 그런데 둘 다 정답이었다.
프로그래머스의 채점 시스템 때문인지, 내가 모르는 무언가가 있는지 잘 모르겠다.

profile
매일 매일 규칙적으로

0개의 댓글