[ORACLE] 프로그래머스 헤비 유저가 소유한 장소 (+ MySQL)
2021. 5. 30.
반응형

 

https://programmers.co.kr/learn/courses/30/lessons/77487

 

코딩테스트 연습 - 헤비 유저가 소유한 장소

PLACES 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다. PLACES 테이블의 구조는 다음과 같으며 ID, NAME, HOST_ID는 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디를

programmers.co.kr

 

1. 서론

 

처음에는 막막했는데 '내가 천재인가?' 싶을 정도로 금방 풀리는 문제

 

2. 문제 풀이

 

PLACES: 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블

테이블 구조:  ID, NAME, HOST_ID( 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디)

 

Q. 서비스에서는 공간을 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.

 

일단 이 문제를 풀기 위해서는 헤비 유저를 구해야 한다. 헤비 유저는 공간을 둘 이상 등록한 사람이다. 즉, 같은 host_id가 둘 이상인 사람을 찾아야 한다. 난 그래서 count 함수를 이용해 host_id를 count 했다. 그리고 이 아이디와 places 테이블의 아이디를 비교해 둘이 같은 host_id를 갖은 사람을 찾아줬다.

 

3. 코드 설명

 

SELECT a.id, a.name, a.host_id
FROM places a, (
    SELECT host_id, count(host_id)
    FROM places
    GROUP BY host_id
    HAVING count(host_id) >= 2) b
WHERE a.host_id = b.host_id
ORDER BY a.id;

 

그냥은 안되고 서브 쿼리를 이용해서 풀었다.

b테이블에서 헤비 유저를 찾아준다. 이때, host_id로 그룹을 묶어서 count를 해주고, 그중에 host_id가 2개 이상인 사람들을 조회한다.

그리고 이걸 찾은 헤비 유저 host_id로 a테이블에서 host_id가 같은 사람을 찾아 값들을 조회해준다. 그리고 아이디 순으로 조회하라고 해서 order by를 써줬는데 원래 데이터가 아이디 순으로 들어가 있는지 안 써도 정답처리되더라....

 

 

+ (MySQL)

 

select a.id, a.name, a.host_id
from places a, places b
where a.host_id = b.host_id
group by a.id
having count(a.host_id) > 1
order by a.id

 

오랜만에 다시 풀고 전에 어떻게 풀었나 보러 왔는데 대박 복잡하게 풀었네... 저래놓고 천재인가? 막 이러네 ㅋㅋㅋ ㅠㅠ

아마도 집계함수를 쓰면 무조건 select에 써야 having을 쓸 수 있다고 생각해서 저렇게 푼듯

아니어도 풀린다... 학교 다닐때 뭔가 그렇게 배운 것 같은데 having where 같이 못 쓴다고

 

위에 두 줄이 다 Oracle에서는 저렇게 해야 되서 그렇게 한거구나... 천재 맞네

지금 확인해보니까 이게 MySQL로 풀어서 되는거구나... oracle보다 훨 낫네 진심? 여러분도 참고 하시길^^.... 

 

 

 

반응형
myoskin