SQL/문제풀이

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

응엉잉 2024. 2. 12. 20:54

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

원래 하고싶었던건

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개를 작성한 사람이 여러명인 경우에는 틀리게되는거 아닌가 싶어서 ... 나는 이렇게 짜는게 맞는것같다!