https://school.programmers.co.kr/learn/courses/30/lessons/131124
원래 하고싶었던건
1. 가장 많은 리뷰를 남긴 사람의 리뷰 수를 뽑고
2. 그 리뷰수를 남긴 사람의 리스트를 뽑고
3. 그 리스트를 활용해서 리뷰를 뽑는거였다
1.
SELECT m.member_name,
COUNT(r.review_id) AS cnt
FROM rest_review r
JOIN member_profile m ON r.member_id = m.member_id
GROUP BY m.member_name
ORDER BY cnt DESC
LIMIT 1
김민재 외에도 3개의 리뷰를 남긴 사람이 있겠지만 아무튼 가장 많은 리뷰 개수는 3개다.
2.
WITH temp AS (
SELECT m.member_name,
COUNT(r.review_id) AS cnt
FROM rest_review r
JOIN member_profile m ON r.member_id = m.member_id
GROUP BY m.member_name
ORDER BY cnt DESC
LIMIT 1
)
SELECT m.member_name,
COUNT(r.review_id) AS count
FROM rest_review r
JOIN member_profile m ON r.member_id = m.member_id
GROUP BY m.member_name
HAVING count = temp.cnt
SQL 실행 중 오류가 발생하였습니다.
Unknown column 'temp.cnt' in 'having clause'
이런 경고가 뜬다 ...
WITH를 사용해 선언한 temp 테이블을 다른 테이블과 JOIN 하는데 사용할수는 있지만,
직접적으로 참조하는 것은 SQL에서 지원하지 않는다고 한다 !
오키오키
수정한 쿼리는 다음과 같다.
WITH
review_cnt AS (
SELECT r.member_id,
COUNT(r.review_id) AS cnt
FROM rest_review r
GROUP BY r.member_id
),
max_review_cnt AS (
SELECT MAX(cnt) AS maxcount
FROM review_cnt
)
SELECT p.member_name,
r.review_text,
DATE_FORMAT(r.review_date, '%Y-%m-%d') AS review_date
FROM rest_review r
JOIN review_cnt c ON r.member_id = c.member_id
JOIN max_review_cnt m on c.cnt = m.maxcount -- cnt와 maxcount가 일치하는 경우만 join
JOIN member_profile p ON r.member_id = p.member_id
ORDER BY review_date, r.review_text
원래 하려던 방식에서 조금 달라졌다.
JOIN은 꼭 필요한 경우에만 사용하기 위해 서브쿼리 작성시에는 사용하지 않았다
1. rest_review 테이블을 이용하여 유저 ID별 리뷰 수를 count (review_cnt 테이블)
2. 유저 ID별 리뷰 수의 최대값을 구함 (max_review_cnt 테이블)
3. 1번과 2번의 테이블을 이용해서 원하는 값을 도출
하지만 이렇게 짜면 쿼리가 너무 길어져서, 좀 더 효율적인 방법이 없는지 찾아봤다.
대부분의 쿼리들이 LIMIT 1을 사용하여 WHERE절의 서브쿼리를 작성한다.
그런데 이렇게 작성하게 되면 예를 들어 3개가 최대 리뷰 수이고, 3개를 작성한 사람이 여러명인 경우에는 틀리게되는거 아닌가 싶어서 ... 나는 이렇게 짜는게 맞는것같다!
'SQL > 문제풀이' 카테고리의 다른 글
[프로그래머스] 상품을 구매한 회원 비율 구하기 📌 (0) | 2024.02.13 |
---|---|
[프로그래머스] 보호소에서 중성화한 동물 📌 (0) | 2024.02.12 |
[프로그래머스] 5월 식품들의 총매출 조회하기 (0) | 2024.02.12 |
[프로그래머스] 입양 시각 구하기 (2) (0) | 2024.02.12 |
[프로그래머스] 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.02.12 |