본문 바로가기

SQL/프로그래머스

SQL 프로그래머스_6일차_1 JOIN ,GROUP BY ,RANK(), 이중 서브쿼리

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

 

문제

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

 

테이블 소개

 

이 문제 좀 어렵다.

머리를 잘 굴려야 한다.

이중 서브쿼리이므로 마지막 서브쿼리부터 어떻게 작성할지 고민해야한다.

 

정답코드

SELECT MEMBER_NAME,REVIEW_TEXT,DATE_FORMAT(REVIEW_DATE,'%Y-%m-%d') as REVIEW_DATE
FROM REST_REVIEW R                  -- 4. 리뷰행마다 순위를 추가하기 위해 회원별 순위를 정한 테이블과 리뷰 테이블을 조인한다. 
JOIN( 
    SELECT  A.MEMBER_ID, MEMBER_NAME, RANK() OVER(ORDER BY CNT DESC) TOP  -- 3. 회원별 리뷰수를 rank로 순위를 정한다.
    FROM  MEMBER_PROFILE A
    JOIN (
        SELECT *, COUNT(MEMBER_ID) AS CNT   -- 1.회원별 리뷰 수를 카운트한다 
        FROM REST_REVIEW  
        GROUP BY MEMBER_ID) B 
    ON A.MEMBER_ID = B.MEMBER_ID            -- 2. 1번과정에 회원이름을 추가하기위해 고객테이블을 조인한다.
    ) G
ON R.MEMBER_ID = G.MEMBER_ID
WHERE TOP = 1
ORDER BY REVIEW_DATE, REVIEW_TEXT

코드 단계별 작성법

1. 문제가 리뷰작성수가 많은 회원의 모든 리뷰를 조회하기 위해 먼저 리뷰를 가장 많이 쓴 회원이 누구인지 조회해야한다.

SELECT *, COUNT(MEMBER_ID) AS CNT   -- 1.회원별 리뷰 수를 카운트한다 
FROM REST_REVIEW  
GROUP BY MEMBER_ID

 

2. 카운트한 회원 테이블에 회원이름을 추가하기 위해 회원명단 테이블을 조인한다.

그후 조인한 테이블을 RANK를 이용해 카운트수로 순위를 정한다.

    SELECT  A.MEMBER_ID, MEMBER_NAME, RANK() OVER(ORDER BY CNT DESC) TOP  -- 3. 회원별 리뷰수를 rank로 순위를 정한다.
    FROM  MEMBER_PROFILE A
    JOIN (
        SELECT *, COUNT(MEMBER_ID) AS CNT   -- 1.회원별 리뷰 수를 카운트한다 
        FROM REST_REVIEW  
        GROUP BY MEMBER_ID) B 
    ON A.MEMBER_ID = B.MEMBER_ID -- 2. 1번과정에 회원이름을 추가하기위해 고객테이블을 조인한다.
    ) G

3.  전체 리뷰 테이블 리뷰마다 회원 순위를 추가하기 위해 이중쿼리와 조인한다. 그 후 순위 컬럼(TOP)가 1인 것만 조회한다.

SELECT MEMBER_NAME,REVIEW_TEXT,DATE_FORMAT(REVIEW_DATE,'%Y-%m-%d') as REVIEW_DATE
FROM REST_REVIEW R  
JOIN( -- 생략 --) G 
ON R.MEMBER_ID = G.MEMBER_ID
WHERE TOP = 1
ORDER BY REVIEW_DATE, REVIEW_TEXT

 

시도  코드

1. 공동 1등이 다수이기 때문에 LIMIT을 쓰면 한명만 나와서 안된다.

SELECT MEMBER_NAME,	REVIEW_TEXT	,DATE_FORMAT(REVIEW_DATE,'%Y-%m-%d')
FROM MEMBER_PROFILE M
JOIN (SELECT *, COUNT(*) AS TOP FROM REST_REVIEW  GROUP BY MEMBER_ID ORDER BY TOP DESC LIMIT 1) R
ON M.MEMBER_ID = R.MEMBER_ID

2.조건 유저가 가장 많은 리뷰를 썻는지 확인

누가 1등인지 그룹바이로 확인한 후에 회원ID를 저장 후 IN으로 검색하는 방법이 있다.

-- 조건 유저가 가장 많은 리뷰를 썻는지 확인
 SELECT * FROM REST_REVIEW WHERE MEMBER_ID = 'ksjs1115@gmail.com'