프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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과 =의 차이를 잘 알고 사용하도록 하자❗❗
'데이터베이스 > MYSQL' 카테고리의 다른 글
[MYSQL] 우유와 요거트가 담긴 장바구니 (0) | 2023.01.08 |
---|---|
[MYSQL] 오랜 기간 보호한 동물(2) (0) | 2023.01.08 |
[MYSQL] 가격대 별 상품 개수 구하기 (1) | 2023.01.07 |
[MYSQL] 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2023.01.07 |
[MYSQL] 성분으로 구분한 아이스크림 총 주문량 (0) | 2023.01.05 |
댓글