20240802 TIL
<고객의 정보를 담은 MEMBER_PROFILE 테이블>
<식당의 리뷰 정보를 담은 REST_REVIEW 테이블>
<문제>
MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
<나의 풀이>
with max_ as (
select count(*), member_id
from rest_review
group by member_id
order by count(*) desc
limit 1
)
select m.member_name,
r.review_text,
date_format(r.review_date, '%Y-%m-%d') as review_date
from member_profile m inner join rest_review r on m.member_id=r.member_id
where m.member_id = (select member_id from max_)
order by r.review_date, r.review_text
<풀이 해석>
1. REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 count(*), member_id컬럼을 조회하는 테이블을 WITH 절로 선언
-member_id 기준으로 그룹화 한 후 count로 집계 한 것을 내림차순으로 하여 큰 숫자부터 나오게 함
-limit을 통해 적어도 1명은 나오도록 실행
--> 리뷰를 가장 많이 작성한 회원 구해짐
2. member_id로 조인으로 결합을 하고 select에 필요한 컬럼인 member_name, review_text, review_date 넣어줌
-date_format을 사용한 이유는 결과값에 년월일만 나와있었기 때문에 똑같이 바꿔주기 위해 사용
-where절에 아까 만든 with절의 max_ 테이블을 사용하면서 서브쿼리로 사용
-순서는 리뷰작성일 기준으로 오름차순 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순
<결과값>
<다른 사람 풀이>
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
WHERE A.MEMBER_ID = (SELECT MEMBER_ID FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(*) DESC LIMIT 1)
order by REVIEW_DATE asc, REVIEW_TEXT
참고 사이트 : https://jaehwaseo.tistory.com/21
나의 풀이도 간단하다고 생각했는데 다른 사람의 풀이를 보니 더 간단했다.
여기 블로그에서 정리를 너무 잘한 그림이 있어서 들고 왔다. 한 번쯤 보면 도움이 많이 될 것 같다.
또 하나 알아간다. 굳이 with절을 사용하지 않고 더 간단하게 만들 수 있다는게 ..!
한 문제 푸는데 거의 한시간 가량 걸린 것 같은데 최대한 시간을 줄여서 효율성을 챙겨야겠다.
with (임시 테이블) -with절은 동일한 SQL이 반복되어서 사용될 때 성능을 높이기 위해 사용
- table을 만들지 않고도 table 만든 것과 같은 효과를 내는데, 실제로는 temp라는 임시 테이블에 저장
- 비슷한 기능을 하는 뷰는, 쿼리 결과문을 테이블로 저장하는게 아니라, 그냥 별칭만 해주는 것
- 그래서 뷰를 불러오면 쿼리문이 그대로 실행하는 것과 같음
- 하지만 with는 가상의 테이블, 즉 테이블 // 대신에 메모리를 차지한다는 단점
WITH TEMP_TABLE as
(
SELECT NAME, count(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
ORDER BY NAME
)
SELECT * FROM TEMP_TABLE
WHERE COUNT > 1
참고 사이트: https://inpa.tistory.com/entry/MYSQL-📚-WITH-임시-테이블#
'CODEKATA' 카테고리의 다른 글
[MySQL] 오프라인/온라인 판매 데이터 통합하기 (0) | 2024.08.05 |
---|---|
[Python] 제일 작은 수 제거하기 (0) | 2024.08.02 |
[Python] 없는 숫자 더하기 (0) | 2024.08.01 |
[MySQL] 저자 별 카테고리 별 매출액 집계하기 (0) | 2024.07.31 |
[MySQL] 주문량이 많은 아이스크림들 조회하기 (0) | 2024.07.31 |