SQL/코드카타

[프로그래머스] 헤비 유저가 소유한 장소

뜌비뜌바밥 2024. 9. 4. 11:54
문제 설명

 

문제 및 예시

 

문제는 너무 간단하고 테이블도 너무 간단해서 간단한 문제 같지만 간단하지 않았다는 것이 함정..

  • COUNT(HOST_ID) >=2면 되는 것이 아닐까 하고 아주 간단한 생각을 했다

그 결과 오답 행렬

오답 1
SELECT ID, NAME, HOST_ID, COUNT(HOST_ID)
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID)>=2
ORDER BY ID

 

[실행 결과]

 

이렇게 쉽게 답이 나올 거라고 생각했다고???? 네..

문제점을 살펴보자

  • 1. COUNT(HOST_ID)가 나오면 안됩니다...
  • 2. 실행 결과에 HOST_ID가 같은 사람들 정보가 다 산출되어야 하는데 중복 삭제가 되버렸읍니다...
서브 쿼리 - 문제 해결의 시작 그리고 삽질의 시작

 

다행히 논리로는 COUNT(HOST_ID)가 하나의 행으로 추가가 되어서 2 이상인 사람을 추리면 되겠다는 결론까지는 잘 도달함.

근데 문제는 하나의 행으로 추가하는 방법을 모르는 나는 바보....

나름 서브쿼리 까지는 생각을 했는데 쓸데 없는 SELECT, WHERE절에 쓰고 있는 나를 어쩌면 좋을까...

#오답의 시작
SELECT PLACES.HOST_ID, ID, NAME, (SELECT HOST_ID, COUNT(HOST_ID) 
 FROM PLACES
 GROUP BY HOST_ID
) C_ID
FROM TABLES
GROUP BY HOST_ID
HAVING C_ID >= 2

 

예 당연히 결과 안나오죠..이것을 WHERE절에서도 시도해본 사람 나야나....

검색어를 다양하게 해서 중복값 제거 안하고 산출 등 여러가지 검색을 해보았으나 대차게 실패^^

 

결국 질문 목록에 들어가게 되는데

거기서 마주한 서브조인...??!!!!!!!!!!!!

 

JOIN - 문제 해결의 실마리 

 

이걸 보자마자 아! 행을 테이블로 만들어서 추가해준 다음에 걸러내면 내가 원하는 결과가 나오는 거잖아!

내 논리적 흐름이랑도 같자나! 나 왜 이 생각 못했는데!!!! 겉을 뱅뱅 돌다가 얻은 답은 값지다..

 

정답 - 이걸 몰랐냐고요? 네...알듯 말듯 했어요 그럼 모르는거죠?
SELECT ID, NAME, PLACES.HOST_ID
FROM 
(SELECT HOST_ID, COUNT(HOST_ID) C_ID
 FROM PLACES
 GROUP BY HOST_ID
)A LEFT JOIN PLACES ON A.HOST_ID = PLACES.HOST_ID
WHERE C_ID >=2
ORDER BY ID

 

힌트를 얻고 문제 해결 성공...

세상에 이렇게 간단한 것을...

앞으로 행으로 추가해야겠다 싶을 땐 만들어서 붙여주면 된다. 꺆..!

또 하나 알았다!! 그럼 됐지 뭐!

 

휴 오늘도 하나 넘었다.