프론트엔드

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

journey-dev 2023. 5. 26. 09:21

문제

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

 

1차 시도

// 1. 멤버와 리뷰 테이블을 id 기준으로 조인 하는데 이때, 유형별로 그룹바이로 묶어 리뷰를 카운팅하고, 최대 리뷰쓴 사람 1명의 id만 추출
// 2. 이후 REST_REVIEW 테이블에서 추출된 id값과 같은 데이터를 조회
// 3. name,text,date조회 후 정렬

select MEMBER_NAME, REVIEW_TEXT,  DATE_FORMAT(REVIEW_DATE, "%Y-%m-%d") AS REVIEW_DATE
from  
REST_REVIEW , 
(select P.MEMBER_NAME, R.MEMBER_ID
 from MEMBER_PROFILE P join REST_REVIEW R on P.MEMBER_ID = R.MEMBER_ID 
 group by MEMBER_NAME 
 order by (count(R.MEMBER_ID)) desc limit 1) T
where T.MEMBER_ID = REST_REVIEW.MEMBER_ID
order by REVIEW_DATE, REVIEW_TEXT

[피드백]

- from 에서 인라인 뷰로 새로운 테이블 만들어서 가공후 select에선 결과값만 빼내려고 했는데 

  최대 리뷰 쓴 사람을 알아낸 후 join해야 하므로 where문에서 서브쿼리를 쓰는게 나았다.

- 불필요한 조인 : 최대 리뷰 쓴 사람의 id를 알아내기 위해 두 테이블을 조인 했는데 그럴 필요 없이 REST_REVIEW 테이블만 가지고 할 수 있다.

 

 

2차 시도

[개선]

- where절에서 서브쿼리, 최대 리뷰 쓴 사람id값 추출

- 최대 리뷰 쓴 사람 추출시 REST_REVIEW 테이블만 써도 된다.

# 1. REST_REVIEW 테이블에서 최다 리뷰쓴 사람의 id를 구한다.
# 2. 두 테이블을 member_id 기준으로 조인한 후
# 3. 1번에서 나온 사람의 id를 기준으로 where문에서 조건을 걸어준다.
# 4. 이후 결과값 출력, 정렬

select 	MEMBER_NAME ,	REVIEW_TEXT,	DATE_FORMAT(REVIEW_DATE, "%Y-%m-%d") AS REVIEW_DATE
from MEMBER_PROFILE M join  REST_REVIEW R
on M.MEMBER_ID = R.MEMBER_ID
where M.MEMBER_ID = (select MEMBER_ID from REST_REVIEW group by MEMBER_ID order by  count(MEMBER_ID) desc limit 1)
order by REVIEW_DATE, REVIEW_TEXT

 

 

 

결과