MySQL

헤비 유저가 소유한 장소 (MySQL)

석범 2023. 8. 17. 16:20

헤비 유저가 소유한 장소 - Level 3

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

 

 

위와 같이 헤비유저는 HOST_ID가 2번 이상 나오는 경우를 뜻합니다.

 

 

1
2
3
4
SELECT * FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) >= 2
ORDER BY ID;
cs

 

 

 

 

ID NAME HOST_ID COUNT
4431977 BOUTIQUE STAYS -
Somerset Terrace, Pet Friendly
760849 3
16045624 Urban Jungle in the Heart
of Melbourne
30900122 2

 

 

코드와 같이 현재 헤비유저에 대한 정보는 가져올 수 있습니다.

하지만 문제에서 원하는 것은 헤비유저의 모든 정보입니다.

HOST_ID 760849가 대여한 모든 공간을 표시해주어야 합니다.

그렇게 하기 위해서는 서브쿼리문을 활용해야 합니다.

 

저는 WHERE절에 서브쿼리를 활용하여 문제를 풀었습니다.

WHERE절에 서브쿼리에서 자주 사용되는 것

WHERE = (서브쿼리) OR WHERE IN (서브쿼리)입니다.

= 과 IN의 차이점은 한 가지의 값만 가져올 것인지, 여러 개의 값을 가져올 것인지입니다.

값이 하나만 나올 경우에는 = 을 사용하고 여러 개이면 IN을 활용합니다.

 

그럼 아래와 같은 코드가 구현될 것입니다.

 

 

1
2
3
4
5
6
SELECT * FROM PLACES
WHERE HOST_ID IN
(SELECT HOST_ID FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) >= 2)
ORDER BY ID
cs