문제 설명
PLACES 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다. PLACES 테이블의 구조는 다음과 같으며 ID, NAME, HOST_ID는 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디를 나타냅니다. ID는 기본키입니다.
NAME | TYPE |
ID | INT |
NAME | VARCHAR |
HOST_ID | INT |
문제
이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해 주세요.
예시
예를 들어, PLACES 테이블이 다음과 같다면
ID | NAME | HOST_ID |
4431977 | BOUTIQUE STAYS - Somerset Terrace, Pet Friendly | 760849 |
5194998 | BOUTIQUE STAYS - Elwood Beaches 3, Pet Friendly | 760849 |
16045624 | Urban Jungle in the Heart of Melbourne | 30900122 |
17810814 | Stylish Bayside Retreat with a Luscious Garden | 760849 |
22740286 | FREE PARKING - The Velvet Lux in Melbourne CBD | 30900122 |
22868779 |
★ Fresh Fitzroy Pad with City Views! ★ | 21058208 |
- 760849번 유저는 공간을 3개 등록했으므로 이 유저는 헤비유저입니다.
- 30900122번 유저는 공간을 2개 등록했으므로 이 유저는 헤비유저입니다.
- 21058208번 유저는 공간을 1개 등록했으므로 이 유저는 헤비유저가 아닙니다.
따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.
ID | NAME | HOST_ID |
4431977 | BOUTIQUE STAYS - Somerset Terrace, Pet Friendly | 760849 |
5194998 | BOUTIQUE STAYS - Elwood Beaches 3, Pet Friendly | 760849 |
16045624 | Urban Jungle in the Heart of Melbourne | 30900122 |
17810814 | Stylish Bayside Retreat with a Luscious Garden | 760849 |
22740286 | FREE PARKING - The Velvet Lux in Melbourne CBD | 30900122 |
코드
WITH 절 사용
WITH TEMP AS (
SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) >= 2
)
SELECT P.*
FROM PLACES P
INNER JOIN TEMP T ON P.HOST_ID = T.HOST_ID
ORDER BY 1;
WITH 절
PLACES 테이블에서 HOST_ID를 기준으로 그룹화하여 HOST_ID를 조회한다. 그룹화 조건으로 HOST_ID의 개수가 2개 이상인 HOST_ID들만 그룹화하도록 한다.
WITH 절로 정의한 TEMP 테이블은 다음과 같은 형태로 조회된다.
HOST_ID |
760849 |
30900122 |
SELECT ~ FROM 절
PLACES 테이블의 ID, NAME, HOST_ID 컬럼을 조회한다. (모든 컬럼 조회)
JOIN ON 절
PLACES 테이블(P)과 TEMP 테이블(T)을 INNER JOIN 한다. 조인 조건으로 P 테이블의 HOST_ID와 T 테이블의 HOST_ID가 같은 경우에 조인하도록 한다.
ORDER BY 절
ID를 기준으로 오름차순 정렬한다.
WHERE 절에 서브쿼리 사용
SELECT *
FROM PLACES
WHERE HOST_ID IN (
SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) >= 2
)
ORDER BY 1;
SELECT ~ FROM 절
PLACES 테이블의 ID, NAME, HOST_ID 컬럼을 조회한다. (모든 컬럼 조회)
WHERE 절
조회할 HOST_ID가 서브쿼리로 조회된 HOST_ID인 경우만 조회하도록 한다.
서브쿼리는 PLACES 테이블에서 HOST_ID가 2개 이상인 HOST_ID를 조회하도록 한다.
ORDER BY 절
ID를 기준으로 오름차순 정렬한다.
JOIN ON 절에 서브쿼리 사용
SELECT P.*
FROM PLACES P
INNER JOIN (
SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) >= 2
) AS T ON P.HOST_ID = T.HOST_ID
ORDER BY P.ID
SELECT ~ FROM 절
PLACES 테이블의 ID, NAME, HOST_ID 컬럼을 조회한다. (모든 컬럼 조회)
JOIN ON 절
조인할 서브쿼리는 PLACES 테이블에서 HOST_ID가 2개 이상인 HOST_ID를 조회하도록 작성한다.
PLACES 테이블과 서브쿼리로 작성한 T 테이블과 INNER JOIN 한다. 조인 조건으로 P 테이블의 HOST_ID와 T 테이블의 HOST_ID가 같은 경우 조인하도록 한다.
ORDER BY 절
ID를 기준으로 오름차순 정렬한다.
'코딩 테스트(Coding Test) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 - MySQL (0) | 2023.06.13 |
---|---|
[프로그래머스] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 - MySQL (0) | 2023.06.12 |
[프로그래머스] 조건에 맞는 사용자 정보 조회하기 - MySQL (0) | 2023.06.10 |
[프로그래머스] 대여 기록이 존재하는 자동차 리스트 구하기 - MySQL (0) | 2023.06.09 |
[프로그래머스] 즐겨찾기가 가장 많은 식당 정보 출력하기 - MySQL (0) | 2023.06.08 |