헤비 유저가 소유한 장소 - 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 |
'MySQL' 카테고리의 다른 글
| 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (MySQL) (0) | 2023.08.18 |
|---|---|
| 조건별로 분류하여 주문상태 출력하기 (MySQL) (0) | 2023.07.10 |
| 식품분류별 가장 비싼 식품의 정보 조회하기 (MySQL) (0) | 2023.07.06 |
| 있었는데요 없었습니다 (MySQL) (0) | 2023.07.05 |
| 카테고리 별 도서 판매량 집계하기 (MySQL) (0) | 2023.07.05 |