https://programmers.co.kr/learn/courses/30/lessons/77487
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보다 훨 낫네 진심? 여러분도 참고 하시길^^....
'SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2023.01.12 |
---|---|
[SQLD] SQLD 요약본 아카이브 (0) | 2021.07.02 |
[ORACLE] 프로그래머스 보호소에서 중성화한 동물 (0) | 2021.05.27 |
[ORACLE] 프로그래머스 오랜 기간 보호한 동물(2) (+MySQL) (0) | 2021.05.27 |
[ORACLE] 프로그래머스 중성화 여부 파악하기 (0) | 2021.05.27 |