본문 바로가기

프로그래머스 풀이/Lv 4

[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 (ORACLE)

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/131124

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

이 문제의 핵심은 한 테이블에서 가장 많은 결과값을 어떻게 가져오느냐? 이다.

 

가장 많은 리뷰의 멤버아이디를 찾는 것이 관건인데

오라클은 LIMIT 가 없기 때문에 다음과 같은 방법을 사용한다

 

SELECT 
            MEMBER_ID 
        FROM (
            SELECT MEMBER_ID 
            FROM REST_REVIEW
            GROUP BY MEMBER_ID
            ORDER BY COUNT(*) DESC
        )
        WHERE ROWNUM = 1

 

리뷰 테이블에서 멤버아이디로 그룹핑하고 카운트별로 정렬한 다음 ROWNUM = 1 처리하는 것이다. 

그런데 왜 ROWNUM 을 굳이 밖에 뺐을까? 이유는 오라클의 처리순서 때문이다.

WHERE → GROUP BY → ORDER BY

 

순서이기때문에 먼저 ROWNUM 으로 맨위에거만 처리되어 버리기 때문이다.

 

저것만 하면 끝났다. 이제 조인만하면 된다.

 

-- 코드를 입력하세요
-- 1. 가장 많은 리뷰 쓴 테이블을 조회
-- 2. 그것과 조인

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 = (
        SELECT 
            MEMBER_ID 
        FROM (
            SELECT MEMBER_ID 
            FROM REST_REVIEW
            GROUP BY MEMBER_ID
            ORDER BY COUNT(*) DESC
        )
        WHERE ROWNUM = 1
    )
    ORDER BY REVIEW_DATE , B.REVIEW_TEXT