기록하고 까먹지 말기

(SQL) 그룹별 조건에 맞는 식당 목록 출력하기 본문

전공/프로그래머스

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

yha97 2023. 10. 6. 22:04

날짜 : 2023. 10. 06

사용 언어 : oracle

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/131124?language=oracle

 

코드

-- 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회
-- 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력
-- 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬

SELECT A.MEMBER_NAME, B.REVIEW_TEXT, TO_CHAR(B.REVIEW_DATE, 'yyyy-mm-dd') AS REVIEW_DATE
FROM MEMBER_PROFILE A
JOIN REST_REVIEW B ON A.MEMBER_ID = B.MEMBER_ID
WHERE A.MEMBER_ID IN (
    SELECT MEMBER_ID
    FROM (
        SELECT MEMBER_ID, COUNT(*) AS QUANTITY
        FROM REST_REVIEW
        GROUP BY MEMBER_ID
        ORDER BY QUANTITY DESC
        )
    WHERE ROWNUM < 2
    )
ORDER BY B.REVIEW_DATE ASC, B.REVIEW_TEXT ASC
;

 

 

풀이

- 회원 프로필과 리뷰 테이블을 회원 ID를 기준으로 join한 다음, 서브쿼리를 활용해 리뷰를 가장 많이 작성한 회원의 ID를 구한 다음 조건에 맞게 정렬, 출력한다.

- 서브쿼리의 경우에 우선 회원별 리뷰 작성 개수를 구하고, 이를 오름차순으로 정렬한다.

- 다만 정렬과 where 절은 한번에 사용이 불가능하기 때문에 또 서브쿼리를 사용해 멤버별 리뷰 개수를 내림차순으로 구한 임시 테이블을 만든 후,

- 해당 임시 테이블에서 가장 위에 있는 row만 잘라낸 다음 MEMBER_ID를 추출하여 기존에 join한 테이블과 매칭하여 값들을 출력한다.

 

 

알게된 점

- 가장 안쪽의 서브쿼리에서 order by 절을 중간 서브쿼리 절에 쓰는 바람에 오류가 발생했었다.

 

 

참고 사이트