본문 바로가기
데이터베이스/MYSQL

[MYSQL] 그룹별 조건에 맞는 식당 목록 출력하기

by 썬키 2023. 1. 8.
 

프로그래머스

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

programmers.co.kr

링크를 클릭하면 해당 문제로 이동합니다.

 

 

출처 - 프로그래머스

 

분명, 이 쿼리가 맞는데 왜 실행이 안될까?.. 한 2시간 가량 잡고 있었던 문제였다.

접근 방법이 아예 틀렸으면 화도 안나는데, 겨우 단어? 하나 때문에 시간을 저만큼 끌었다는게 킹받음...

 

1. 접근하기

출처 - 프로그래머스

첫 번째로, GROUP BY절에서 MEMBER_ID로 묶어버리고 COUNT(REVIEW_ID)를 사용해서

리뷰를 제일 많이 작성한 사람이 누구인지 알아보자.

# 리뷰를 가장 많이 작성한 MEMBER_ID
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(REVIEW_ID) DESC LIMIT 1

출처 - 프로그래머스

2. 풀이

SELECT P.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM MEMBER_PROFILE P, REST_REVIEW R
WHERE P.MEMBER_ID = R.MEMBER_ID
    AND P.MEMBER_ID = ( SELECT MEMBER_ID
                        FROM REST_REVIEW
                        GROUP BY MEMBER_ID
                        ORDER BY COUNT(REVIEW_ID) DESC LIMIT 1  )
ORDER BY 3, 2;

SELECT 절에 필요한 값들이 JOIN을 해야 얻을 수 있는 값들이라 INNER JOIN을 했고, WHERE 절에 서브쿼리를 이용해서 원하는 데이터를 출력하는데에 성공했다.

 

출처 - 프로그래머스

# 번외 - 2시간을 헤맨 이유

SELECT P.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM MEMBER_PROFILE P, REST_REVIEW R
WHERE P.MEMBER_ID = R.MEMBER_ID
    AND P.MEMBER_ID IN ( SELECT MEMBER_ID
                        FROM REST_REVIEW
                        GROUP BY MEMBER_ID
                        ORDER BY COUNT(REVIEW_ID) DESC LIMIT 1  )
ORDER BY 3, 2;

출처 - 프로그래머스

쿼리를 위와 같이 작성하면 서브쿼리에 LIMIT, IN/ALL/ANY/SOME 을 지원하지 않는다고 나온다.

그래서 나는 당연히 '아, 서브쿼리 안에서는 LIMIT을 쓸 수 없구나' 하고 열심히 구글링을 해봤다.

 

내용은 서브쿼리에서 LIMIT을 사용하려면 그 서브쿼리를 묶어서 Alias를 만든 다음에 어쩌고저쩌고~ 하는 내용이다.

그래서 그렇게 해봤더니 또 다른 오류가 생겨서 😨😭😠😡🤬 < 그 자체였는데 서브쿼리 앞에

IN이 아니라 = 을 넣는게 맞지 않나? 싶어서 해봤더니 잘 실행되었다... 하하...

IN과 =의 차이를 잘 알고 사용하도록 하자❗❗

댓글