코딩테스트/SQL

[MySQL] 헤비유저가 소유한 장소

rlatotquf45 2024. 12. 23. 16:05
728x90
반응형

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

문제 요약

PLACES 테이블에서 공간을 둘 이상 등록한 "헤비 유저"의 공간 정보를 조회하고, 결과를 ID 순으로 정렬해야 합니다.

풀이 방법

  1. 헤비 유저 식별:
    • HOST_ID를 기준으로 그룹화하여 각 유저가 등록한 공간의 개수를 계산합니다.
    • COUNT(*) >= 2 조건을 만족하는 유저를 식별합니다.
  2. 헤비 유저의 공간 정보 조회:
    • 서브쿼리 또는 CTE를 이용해 필터링된 유저의 HOST_ID를 기반으로 원래 테이블에서 데이터를 조회합니다.
  3. 결과 정렬:
    • 결과를 ID 기준으로 정렬합니다.

정답 코드

SELECT p.ID, p.NAME, p.HOST_ID
FROM PLACES as p
WHERE p.HOST_ID IN (
    SELECT HOST_ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(*) >= 2
)
ORDER BY p.ID;

새롭게 배운 내용

CTE를 활용한 풀이

CTE(Common Table Expression)를 사용하면 가독성이 높아지고 쿼리의 단계별 논리를 명확하게 표현할 수 있습니다. 다음은 CTE를 활용한 풀이입니다:

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

CTE와 MySQL의 WITH문 개념

  1. CTE란?
    • CTE(Common Table Expression)는 쿼리에서 임시로 정의된 이름 있는 결과 집합입니다.
    • CTE는 가독성을 높이고, 재귀적 쿼리나 복잡한 쿼리 구조를 단순화할 때 유용합니다.
  2. MySQL에서 CTE와 WITH문
    • WITH 키워드를 사용하여 CTE를 정의합니다.
    • CTE는 WITH로 시작하며, 이후 메인 쿼리에서 사용됩니다.
    • MySQL 8.0 이상 버전에서 지원됩니다.
  3. 사용 방식
    • WITH CTE_name AS (쿼리) 형태로 작성합니다.
    • CTE는 일반 테이블처럼 메인 쿼리에서 참조할 수 있습니다.
728x90
반응형