[SQL] 프로그래머스 : 헤비 유저가 소유한 장소

김시은·2022년 8월 28일
3

👉🏻 문제보러가기

1. IN을 이용해서 풀기

💡풀이

  1. 공간을 둘 이상 등록한 헤비 유저를 찾는다.

    host_id를 기준으로 그룹핑, 등록한 공간의 id가 2이상인 host_id 출력

    SELECT host_id
    FROM Places
    GROUP BY host_id
    HAVING COUNT(id) >= 2
  2. 1번에서 찾은 host_id와 일치하는 공간의 정보를 출력한다.

    1번을 서브쿼리로 활용

    SELECT *
    FROM Places
    WHERE host_id IN (SELECT host_id
                        FROM Places
                        GROUP BY host_id
                        HAVING COUNT(id) >= 2)
    ORDER BY id

2. JOIN을 이용해서 풀기

💡풀이

  1. Places 테이블을 host_id 기준으로 셀프조인한다.
    SELECT *
    FROM Places P1 JOIN Places P2 ON P1.host_id = P2.host_id

아래와 같이 host_id가 같은 것끼리 테이블이 확장된다.

  1. 여기서, id가 같은 것들은 제외해준다.
    host_id 기준으로 셀프 조인을 했을 때, id가 같은 row만 있다면 자기 자신 외에 host_id 가 같은 공간은 없다는 뜻이기 때문이다.
    SELECT *
    FROM Places P1 JOIN Places P2 ON P1.host_id = P2.host_id
    WHERE P1.id != P2.id

host_id는 같지만, 공간은 다른(id가 다른) 것끼리만 조인되어 남는다.

  1. 이 중 중복되는 것들만 제외하고 프린트해준다. 문제에서 요구한대로, id순서대로 정렬해준다.
    #최종 코드
    SELECT DISTINCT P1.id, P1.name, P1.host_id
    FROM Places P1 JOIN Places P2 ON P1.host_id = P2.host_id
    WHERE P1.id != P2.id
    ORDER BY P1.id

3. EXISTS를 이용해서 풀기

  1. IN을 이용했던 풀이와 같이, 공간을 둘 이상 등록한 헤비 유저를 찾는다.

    SELECT *
    FROM Places
    GROUP BY host_id
    Having COUNT(id) >= 2
  2. EXISTS를 이용하여, 1번 서브쿼리의 결과에 '존재하는' 공간 정보만 출력해준다.

    SELECT *
    FROM Places P1
    WHERE EXISTS(SELECT *
    			FROM Places P2
    			GROUP BY P1.host_id = P2.host_id
    			Having COUNT(id) >= 2)
    ORDER BY id;

    ✔️ROW를 비교하여 체크해주기 때문에, JOIN을 해줄 때처럼 특정 컬럼을 기준으로 연동을 해줘야 한다.
    -> 따라서 동일한 테이블을 가지고 서브쿼리에서 비교해줄 때는, 위와 같이 alias를 사용하여 분리해줘야 한다.

✏️EXISTS에 대해 알아보자

EXISTS는 조건에 맞는 ROW에 서브쿼리에 존재하는지 체크한다.

  • IN과 다른 점은,
    • 조건에 해당하는 ROW가 서브쿼리에 존재 유무만을 체크함
      <-> IN은 조건의 해당하는 ROW의'컬럼'을 비교해서 체크함
    • SELECT 절의 컬럼값을 가지고 비교하는 IN에 비해서 성능이 좋음
  • 조건에 맞지 않는 ROW만 추출하고 싶다면 NOT EXISTS를 사용!
profile
데이터분석가를 꿈꾸어요

0개의 댓글