NullNull

프로그래머스 SQL 헤비 유저가 소유한 장소 본문

SQL

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

KYBee 2022. 3. 1. 13:43

Data 구조

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

NAME TYPE
ID INT
NAME VARCHAR
HOST_ID INT

 

문제

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

 

예시

Input:

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

Output:

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

 

정답:

저는 이 문제를 두 가지 방법으로 풀었습니다.

1. INNER JOIN

2. EXISTS

 

1. INNER JOIN

풀의를 위한 로직은 다음과 같습니다.

- 우선 서브쿼리를 이용하여 HOST_ID를 그룹화 한 뒤에 2개 이상인 데이터만 뽑아냅니다.

- 그 서브쿼리와 원래의 테이블을 INNER JOIN 하여 2개 이상인 데이터와 원래 데이터 사이의 교집합을 찾습니다. 

SELECT A.ID, A.NAME, A.HOST_ID
FROM PLACES A INNER JOIN (
    SELECT HOST_ID FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
) B
ON A.HOST_ID = B.HOST_ID
ORDER BY A.ID;

 

2. EXISTS

EXISTS를 이용하면 아마 더 좋은 성능으로 결과를 추출할 수 있습니다. JOIN을 하는데 필요한 비용도 없고 EXISTS는 특정 조건을 만족하는 ROW가 발견되면 더 이상 검색을 하지 않고 TRUE를 반환하기 때문에 더 빠른 조회가 가능해집니다. 

서브쿼리를 이용하는 방식까지는 똑같지만 서브쿼리의 결과를 TRUE or FALSE로 반환합니다.

SELECT * FROM PLACES A 
WHERE EXISTS (
    SELECT 1 FROM PLACES B
    WHERE A.HOST_ID = B.HOST_ID
    GROUP BY B.HOST_ID
    HAVING COUNT(B.HOST_ID) >= 2
)
ORDER BY ID;
Comments