MySQL 프로그래머스 | 헤비 유저가 소유한 장소 (집계함수 없는 GROUP BY절의 결과)

    728x90

     

     

    문제

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

     

    프로그래머스

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

    programmers.co.kr

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

     

    테이블

    PLACES

     

     

    풀이과정

    # 전체 테이블 조회

    • HOST_ID가 두 번 이상 등장하는 사람들 = 공간을 둘 이상 등록한 헤비 유저들
      • HOST_ID가 760849, 30900122인 유저가 헤비 유저
      • HOST_ID가  760849 유저는 공간을 3개,  30900122 유저는 2개 가지고 있음
    1
    2
    3
    SELECT *
    FROM PLACES
    ORDER BY HOST_ID
    cs

     

     

    # HOST_ID로 GROUP BY 해주기 (집계함수 없는 GROUP BY절의 결과)

    • HOST_ID로 GROUP BY를 해주면, 
      하단의 이미지처럼 HOST_ID 별로 (공간이 몇 개가 있든) 하나의 공간 데이터만 나오게 됨.
      • 헤비 유저인 760849, 30900122의 경우에도 하나의 공간 데이터만 조회되고 있음.
    1
    2
    3
    4
    SELECT *
    FROM PLACES
    GROUP BY HOST_ID
    ORDER BY HOST_ID
    cs

     

     

    # 이 중 헤비 유저(공간을 둘 이상 등록) 필터링하기

    • HOST_ID 별로 GROUP BY된 테이블에서
      HAVING절을 이용해 ID (공간ID)가 둘 이상인 데이터만 필터링하기
      → 이렇게 하면 헤비 유저의 HOST_ID만 필터링됨
    1
    2
    3
    4
    SELECT *
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(ID) >= 2
    cs

     

    # 원래 테이블과 위에서 필터링된 테이블 조인하기

    • 원래 테이블과 위에서 필터링한 테이블을 HOST_ID 기준으로 조인하기
      • 위에서 필터링된 테이블의 HOST_ID는 헤비 유저의 HOST_ID 뿐임.
      • 원래 테이블을 이 필터링된 HOST_ID가 같은 경우에만 조인하게 되면 헤비 유저들의 공간 정보(ID, NAME)를 조회할 수 있게 됨

     

    # 정답

    • SELECT절에 조회할 컬럼 적고, 정렬 조건만 주면 끝!
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT P1.ID, P1.NAME, P1.HOST_ID
    FROM PLACES P1
    JOIN (SELECT HOST_ID
          FROM PLACES
          GROUP BY HOST_ID
          HAVING COUNT(ID) >= 2) P2
    ON P1.HOST_ID = P2.HOST_ID
    ORDER BY P1.ID
    cs

    728x90

    댓글