https://school.programmers.co.kr/learn/courses/30/lessons/131124
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제에서는 가장 많은 리뷰 수를 가진 회원 정보에 관한 데이터를 추출하라고 요구하였습니다.
제가 문제에 접근한 방식은 아래와 같습니다.
1. 리뷰 테이블에 존재하는 ROW 수를 회원ID 별로 COUNT한다.
2. 리뷰 테이블의 ROW수를 회원ID로 구분한 COUNT와 1에서 구한 COUNT의 최대값과 같은 MEMBER_ID를 SELECT한다.
3. 도출한 MEMBER_ID를 WHERE절로 감싸 문제에서 요구하는 데이터를 추출한다.
맞이했던 문제점은 두가지였습니다.
1. 리뷰 COUNT의 최대값은 구했으나 2번을 어떻게 쿼리문으로 구현하는 부분
2. MAX(COUNT)의 형태로 MEMBER_ID를 구하면 가장 많은 리뷰 수를 가진 MEMBER가 다수일 경우에도 자꾸 하나의 데이터만 반환하는 문제
구글링을 통해 HAVING 절에 집계함수 COUNT를 SELECT하는 서브쿼리를 작성해 조건을 충족시키는 방법이 있었습니다.
답안 코드는 아래와 같습니다.
# 1. 회원 중 리뷰가 가장 많은 수를 리턴하는 서브쿼리
# 2. 해당 서브쿼리의 결과 값으로 결과 출력
# 3. 회원과 리뷰 컬럼을 SELECT 하므로 JOIN 처리하기
# 4. 정렬 조건 처리 (리뷰 작성일 오름차, 리뷰 텍스트 오름차)
SELECT
MP.MEMBER_NAME,
RR.REVIEW_TEXT,
DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM MEMBER_PROFILE MP
INNER JOIN REST_REVIEW RR
ON MP.MEMBER_ID = RR.MEMBER_ID
WHERE MP.MEMBER_ID IN (
# 가장 많은 리뷰 갯수인 MEMBER_ID 추출
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
HAVING COUNT(*) = (
# 가장 많은 리뷰 갯수 추출
SELECT COUNT(*) AS CNT
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY CNT DESC
LIMIT 1
)
)
ORDER BY RR.REVIEW_DATE, RR.REVIEW_TEXT;
'Database' 카테고리의 다른 글
[프로그래머스] 주문량이 많은 아이스크림들 조회하기 (0) | 2023.06.19 |
---|