일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 알고리즘
- 누적합
- 자바
- OrderBy
- EC2
- Java
- django
- SQL
- 구현
- 배포
- Database
- 코딩테스트
- 다익스트라
- db
- BFS
- union find
- AWS
- 프로그래머스
- 최단경로
- SQL코딩테스트
- JOIN
- 크루스칼
- 프림
- 백준
- Baekjoon
- MST
- GROUPBY
- 그래프 탐색
- Pirogramming
- 피로그래밍
Archives
- Today
- Total
NullNull
프로그래머스 SQL 헤비 유저가 소유한 장소 본문
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;
'SQL' 카테고리의 다른 글
프로그래머스 SQL 우유와 요거트가 담긴 장바구니 (0) | 2022.03.01 |
---|---|
프로그래머스 SQL DATETIME에서 DATE로 형 변환 (0) | 2022.03.01 |
프로그래머스 SQL 오랜 기간 보호한 동물(2) (0) | 2022.03.01 |
프로그래머스 SQL 중성화 여부 파악하기 (0) | 2022.03.01 |
프로그래머스 SQL 이름에 el이 들어가는 동물 찾기 (0) | 2022.03.01 |
Comments