Rev Notebook

[프로그래머스] SQL Lv.3 - 조건에 맞는 사용자 정보 조회하기

by Rev_

한 테이블에서 특정 조건을 찾아 다른 테이블의 값들을 SELECT 하는 문제였다.

나는 간단하게 GROUP BY 와 HAVING 절을 활용하였다.

 

-- 중고 거래 게시물을 3건 이상 등록한 사용자의
-- 사용자 ID, 닉네임, 전체주소(도로명주소 + 상세주소), 전화번호(하이픈 추가)
-- 회원 ID를 기준으로 내림차순 정렬
-- 중고거래 게시판 테이블
SELECT T1.USER_ID, T1.NICKNAME, T1.CITY || ' ' || T1.STREET_ADDRESS1 || ' ' || T1.STREET_ADDRESS2 AS 전체주소
    ,SUBSTR(T1.TLNO, 1, 3) || '-' || SUBSTR(T1.TLNO, 4, 4) || '-' || SUBSTR(T1.TLNO, 8, 4) AS 전화번호   
FROM USED_GOODS_USER T1
INNER JOIN USED_GOODS_BOARD T2
ON T1.USER_ID = T2.WRITER_ID
GROUP BY T1.USER_ID, T1.NICKNAME, T1.CITY
        , T1.STREET_ADDRESS1, T1.STREET_ADDRESS2, T1.TLNO
HAVING COUNT(T2.BOARD_ID) >= 3
ORDER BY T1.USER_ID DESC
  1. USED_GOODS_USER 테이블과 USED_GOODS_BOARD 테이블을 각각 USER_ID = WRITER_ID로 JOIN 한다.
  2. 사용자ID, 닉네임, 전체주소, 전화번호 SELECT
  3. SELECT 된 값들을 GROUP BY 후 HAVING 절을 통해 BOARD_ID 개수가 3건 이상인 값만 조회

이러한 순서로 문제를 풀어 나갔다.

GROUP BY 에는 조건을 어떻게 걸어야 하는지 아직 헷갈린다..

 

다른 풀이

  • IN절을 사용한 방법

SELECT 절에는 USED_GOODS_USER 테이블의 컬럼밖에 사용되지 않는다.

이 점을 활용하여 JOIN을 사용하지 않고, WHERE절에 서브쿼리를 사용하여 사용자별 게시글의 개수를 그룹핑 하여 조건을 걸어줄 수 있다.

SELECT USER_ID, NICKNAME, CITY || ' ' || STREET_ADDRESS1 || ' ' || STREET_ADDRESS2 AS 전체주소
    ,SUBSTR(TLNO, 1, 3) || '-' || SUBSTR(TLNO, 4, 4) || '-' || SUBSTR(TLNO, 8, 4) AS 전화번호   
FROM USED_GOODS_USER
WHERE USER_ID IN (SELECT A.USER_ID 
                  FROM USED_GOODS_USER A
                  INNER JOIN USED_GOODS_BOARD B
                  ON A.USER_ID = B.WRITER_ID
                  GROUP BY A.USER_ID
                  HAVING COUNT(*) >= 3)
ORDER BY USER_ID DESC

확실히 처음부터 JOIN 조건을 걸어서 그룹핑 하는 것보다는 IN 절을 통하여 조건을 찾아주는 것이 훨씬 효율적일 것 같다.

SELECT A.USER_ID 
FROM USED_GOODS_USER A
INNER JOIN USED_GOODS_BOARD B
ON A.USER_ID = B.WRITER_ID
GROUP BY A.USER_ID
HAVING COUNT(*) >= 3

서브쿼리 안의 쿼리를 살펴보면 ..

문제를 보면 게시글(BOARD_ID)의 개수를 카운팅해야할 것 같지만

USER_ID만 그룹핑하여 세주고 있다.

USER_ID 하나당 여러 개의 게시글을 가질 수 있는 1:N 관계이기 때문에 가능한 것 같다.

각각의 KEY 값으로 JOIN하고, USER_ID를 GROUP BY 하면, 자연스럽게 이용자 당 게시글의 개수를 셀 수 있다. 

 

블로그의 정보

Hi Rev

Rev_

활동하기