SQL/프로그래머스

[프로그래머스/SQL] 헤비 유저가 소유한 장소(MySQL)

류진주 2021. 11. 7. 18:28

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

 

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

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

programmers.co.kr

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

[풀이]

공간을 둘 이상 등록한 사람인 "헤비 유저"가 등록한 공간의 정보를 아이디 순으로 조회해야 한다.

 

1. 값을 조회할 테이블인 PLACES를 FROM절에 작성한다.

 

2. PLACES 테이블의 모든 컬럼을 조회할 것이므로 FROM절의 모든 컬럼을 의미하는 '*'을 이용하여 SELECT *을 작성한다.

 

3. 공간을 둘 이상 등록한 사람을 찾기 위해서는 아이디로 테이블을 그룹화했을 때 COUNT 값이 2 이상인 아이디를 찾아야한다. WHERE절을 사용하지 않고 GROUP BY와 HAVING을 사용하면 헤비 유저가 등록한 모든 공간의 정보가 나오는 것이 아니라 하나의 정보만 표시되게 되므로 WHERE절 안에 서브쿼리를 이용하여 작성해야 한다.

서브쿼리는 (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID
HAVING COUNT(*) >=2)와 같이 작성한다.

이는 HOST_ID로 그룹화한 것 중 해당 아이디가 두 번 이상 등장했는 지 여부를 검사하는 것이다. 즉 공간을 둘 이상 등록한 헤비 유저의 아이디 정보를 담고 있다. 

WHERE절을 WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID
HAVING COUNT(*) >=2)와 같이 작성하여 서브쿼리에 포함된 모든 아이디에 해당되는 공간 정보를 조회할 수 있도록 한다.

 

4. 조건을 만족하는 공간의 정보를 아이디 순으로 조회할 것이므로 ORDER BY절에 ID를 작성한다.

 

[코드]

SELECT *
FROM PLACES
WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID
HAVING COUNT(*) >=2)
ORDER BY ID