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

댓글