SELECT a.member_name,b.review_text,date_format(b.review_date,'%Y-%m-%d') REVIEW_DATE
from member_profile a
join rest_review b
on a.member_id = b.member_id
join (select member_id,count(review_text) cnt from rest_review group by member_id) c
on a.member_id = c.member_id
where cnt = (select count(cnt) cnt from rest_review group by member_id order by 1 desc limit 1)
order by 3 asc,2 asc
SQL에서 임시 테이블(CTE, Common Table Expression)을 만드는 방법
복잡한 쿼리를 더 읽기 쉽게 만들고, 같은 서브쿼리를 여러 번 사용해야 할 때 코드 반복을 줄여준다.
WITH 임시테이블명 AS (
원하는 쿼리 (SELECT ...)
)
SELECT * FROM 임시테이블명;
from 절에서 사용한다.
WITH절을 확장하면 재귀 쿼리(계층 구조 탐색)도 가능하다. (반복문 기능)
WITH 절은 공통 테이블 표현식(CTE)을 정의하는 데 사용되며, 쿼리 내에서 여러 번 사용될 수 있는 서브쿼리를 미리 정의해 두는 방법이다.
WITH member_review_count AS (
SELECT member_id, COUNT(review_text) AS cnt
FROM rest_review
GROUP BY member_id
)
SELECT a.member_name, b.review_text, DATE_FORMAT(b.review_date, '%Y-%m-%d') AS REVIEW_DATE
FROM member_profile a
JOIN rest_review b ON a.member_id = b.member_id
JOIN member_review_count c ON a.member_id = c.member_id
WHERE c.cnt = (
SELECT MAX(cnt)
FROM member_review_count
)
ORDER BY REVIEW_DATE ASC, b.review_text ASC;
SELECT b.member_name,a.review_text,date_format(a.review_date,'%Y-%m-%d') REVIEW_DATE
from rest_review a
left join MEMBER_PROFILE b
on a.member_id = b.member_id
where a.member_id = (select member_id from rest_review group by member_id order by count(*) desc limit 1)
order by 3 asc,2 asc
테스트 케이스에서는 가장 많이 리뷰를 쓴 작성자가 3명이었는데, 문제가 잘못되었는지 한명에 대해서만 추출해도 정답이라고 나왔다. 뭔가 문제가 잘못된 듯?