부제:
그룹별 조건에 맞는 식당 목록 출력하기, 레벨 5
1. 문제 링크:
2. 정답 코드:
SELECT
mp.member_name,
rr.review_text,
date_format(rr.review_date, '%Y-%m-%d') as review_date
FROM member_profile as mp
join rest_review as rr
on mp.member_id = rr.member_id
where mp.member_id = (
select member_id
from rest_review
group by member_id
order by count(*) desc
limit 1
)
order by review_date asc, rr.review_text asc;
3. 오류 상황:
SELECT
mp.member_name,
rr.review_text,
date_format(rr.review_date, '%Y-%m-%d') as review_date
FROM member_profile as mp
join rest_review as rr
on mp.member_id = rr.member_id
where max(count(distinct mp.member_id))
order by review_date asc, rr.review_text asc;
=> 서브쿼리 미활용
=> 집계함수 중첩 오류
4. 시도 방법:
=> 서브쿼리 활용
=> 집계함수 중첩 제거 후 LIMIT 활용
5. 최종 문제 해결 방법:
=> WHERE절은 데이터 하나하나를 검사하는 단계라, 전체 중 "누가 가장 많이 썼는지"를 알지 못한다. 먼저 REST_REVIEW 테이블에서 MEMBER_ID로 그룹화하고, 리뷰 개수를 기준으로 내림차순 정렬한 뒤 LIMIT 1을 사용하여 가장 많이 쓴 사람의 ID 하나만 뽑아야 한다.
=> "최다 리뷰어의 ID"를 메인 쿼리의 필터로 사용해야 한다. 서브쿼리를 WHERE절에 연결하면, 메인 쿼리는 해당 회원의 데이터만 가져오게 된다.
=> SQL에서는 MAX(COUNT(*))와 같이 집계 함수를 중첩해서 바로 사용할 수 없습니다. 대신 "정렬(ORDER BY) + 개수 제한(LIMIT)" 조합을 사용하면 '가장 큰 값'을 가진 행을 찾을 수 있다.
=> 문제의 목표는 "리뷰를 가장 많이 작성한" 사람입니다. COUNT(*)를 기준으로 내림차순(DESC) 정렬을 해야 가장 많이 쓴 사람이 위로 올라온다.
'SQL 알고리즘 코드카타' 카테고리의 다른 글
| SQL 알고리즘 코드카타 23일차(2) 26.01.21(수) (0) | 2026.01.21 |
|---|---|
| SQL 알고리즘 코드카타 23일차(1) 26.01.21(수) (0) | 2026.01.21 |
| SQL 알고리즘 코드카타 22일차(2) 26.01.20(화) (0) | 2026.01.20 |
| SQL 알고리즘 코드카타 22일차(1) 26.01.20(화) (0) | 2026.01.20 |
| SQL 알고리즘 코드카타 21일차(3) 26.01.19(월) (1) | 2026.01.19 |