728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/77487
- 이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부름
- 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성
테이블
PLACES |
풀이과정
# 전체 테이블 조회
- HOST_ID가 두 번 이상 등장하는 사람들 = 공간을 둘 이상 등록한 헤비 유저들
- HOST_ID가 760849, 30900122인 유저가 헤비 유저
- HOST_ID가 760849 유저는 공간을 3개, 30900122 유저는 2개 가지고 있음
1 2 3 | SELECT * FROM PLACES ORDER BY HOST_ID | cs |
# HOST_ID로 GROUP BY 해주기 (집계함수 없는 GROUP BY절의 결과)
- HOST_ID로 GROUP BY를 해주면,
하단의 이미지처럼 HOST_ID 별로 (공간이 몇 개가 있든) 하나의 공간 데이터만 나오게 됨.- 헤비 유저인 760849, 30900122의 경우에도 하나의 공간 데이터만 조회되고 있음.
1 2 3 4 | SELECT * FROM PLACES GROUP BY HOST_ID ORDER BY HOST_ID | cs |
# 이 중 헤비 유저(공간을 둘 이상 등록) 필터링하기
- HOST_ID 별로 GROUP BY된 테이블에서
HAVING절을 이용해 ID (공간ID)가 둘 이상인 데이터만 필터링하기
→ 이렇게 하면 헤비 유저의 HOST_ID만 필터링됨
1 2 3 4 | SELECT * FROM PLACES GROUP BY HOST_ID HAVING COUNT(ID) >= 2 | cs |
# 원래 테이블과 위에서 필터링된 테이블 조인하기
- 원래 테이블과 위에서 필터링한 테이블을 HOST_ID 기준으로 조인하기
- 위에서 필터링된 테이블의 HOST_ID는 헤비 유저의 HOST_ID 뿐임.
- 원래 테이블을 이 필터링된 HOST_ID가 같은 경우에만 조인하게 되면 헤비 유저들의 공간 정보(ID, NAME)를 조회할 수 있게 됨
# 정답
- SELECT절에 조회할 컬럼 적고, 정렬 조건만 주면 끝!
1 2 3 4 5 6 7 8 | SELECT P1.ID, P1.NAME, P1.HOST_ID FROM PLACES P1 JOIN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(ID) >= 2) P2 ON P1.HOST_ID = P2.HOST_ID ORDER BY P1.ID | cs |
728x90
'코딩테스트 > SQL 코드카타' 카테고리의 다른 글
MySQL 프로그래머스 | 우유와 요거트가 담긴 장바구니 (GROUP_CONCAT, LIKE문 풀이 / IN함수 풀이 / 셀프조인 풀이) (1) | 2024.10.21 |
---|---|
MySQL 프로그래머스 | 멸종 위기의 대장균 찾기 (재귀쿼리로 자식 없는 개체수 구하기) (0) | 2024.10.17 |
MySQL 프로그래머스 | 특정 세대의 대장균 찾기 (재귀쿼리로 자식 세대 구하기) (0) | 2024.10.16 |
MySQL 프로그래머스 | 대장균의 크기에 따라 분류하기 2 (PERCENT_RANK 함수 사용) (1) | 2024.10.11 |
MySQL 프로그래머스 | 부모의 형질을 모두 가지는 대장균 찾기 (비트연산자, IN 활용) (1) | 2024.10.10 |
댓글