[SQL] 헤비 유저가 소유한 장소❌

Jaewon Lim·2024년 12월 20일

📝 문제 설명

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

NAMETYPE
IDINT
NAMEVARCHAR
HOST_IDINT

❓ 문제

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

📖 예시

예를 들어, PLACES 테이블이 다음과 같다면

IDNAMEHOST_ID
4431977BOUTIQUE STAYS - Somerset Terrace, Pet Friendly760849
5194998BOUTIQUE STAYS - Elwood Beaches 3, Pet Friendly760849
16045624Urban Jungle in the Heart of Melbourne30900122
17810814Stylish Bayside Retreat with a Luscious Garden760849
22740286FREE PARKING - The Velvet Lux in Melbourne CBD30900122
22868779★ Fresh Fitzroy Pad with City Views! ★21058208
  • 760849번 유저는 공간을 3개 등록했으므로 이 유저는 헤비유저입니다.
  • 30900122번 유저는 공간을 2개 등록했으므로 이 유저는 헤비유저입니다.
  • 21058208번 유저는 공간을 1개 등록했으므로 이 유저는 헤비유저가 아닙니다.
    따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.
IDNAMEHOST_ID
4431977BOUTIQUE STAYS - Somerset Terrace, Pet Friendly760849
5194998BOUTIQUE STAYS - Elwood Beaches 3, Pet Friendly760849
16045624Urban Jungle in the Heart of Melbourne30900122
17810814Stylish Bayside Retreat with a Luscious Garden760849
22740286FREE PARKING - The Velvet Lux in Melbourne CBD30900122

💻 코드

내코드

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

정답코드

SELECT P.ID, P.NAME, P.HOST_ID
FROM PLACES P
WHERE P.HOST_ID IN (
    SELECT HOST_ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
)
ORDER BY P.ID;
WITH USERS AS (
    SELECT HOST_ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
)

SELECT 
    P.ID,
    P.NAME,
    P.HOST_ID
FROM PLACES P
JOIN USERS U
    ON P.HOST_ID = U.HOST_ID
ORDER BY P.ID;

🔍 분석

  1. 와... 이거 쉬운거 같은데 왜 못 풀지..
  • 절대적인 공간을 둘 이상 등록한 사람만 조회한다.
IDNAMEHOST_ID
4431977BOUTIQUE STAYS - Somerset Terrace, Pet Friendly760849
16045624Urban Jungle in the Heart of Melbourne30900122
  • 760849, 30900122 이 두 명만 공간 두 개 이상을 등록한 사람인데, 이 사람들만 가지고 전체 어떤 내용들이 있는지를 구해줘야한다.
  1. 정답을 보고 WITH 써서 해봣는데 이것도 틀렷네..
# 정답
WITH T1 AS(
    SELECT *
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
)

SELECT P.*
FROM PLACES P INNER JOIN T1 T
ON P.HOST_ID = T.HOST_ID
ORDER BY P.ID
  • 본 쿼리에서 P.* 으로 구체적으로 명시해줘야한다.
  • SELECT * 을 사용하면, 그룹화되지 않은 모든 컬럼들에 대해서 어떻게 처리할지 명시되어 있지 않다. 이 경우 대부분 SQL 시스템에서 구문 오류가 발생한다.
# 오답
WITH T1 AS(
    SELECT *
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
)

SELECT *
FROM PLACES P INNER JOIN T1 T
ON P.HOST_ID = T.HOST_ID
ORDER BY P.ID

0개의 댓글