본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 조건에 맞는 사용자 정보 조회하기- 배운점 추가하기

by kime2 2024. 1. 22.

 

출처

 

문제

USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.

문제에 대한 해석

-- 사용자 ID, 닉네임, 전체주소, 전화번호
-- 전체주소: 전체 주소는 시, 도로명 주소, 상세 주소
-- 전화번호: xxx-xxxx-xxxx 
-- 정렬: 회원id 내림차순

풀이(MYSQL)

select b.writer_id, u.nickname, 
	concat(u.CITY,' ',u.STREET_ADDRESS1,' ',u.STREET_ADDRESS2), 
    concat(substr(u.tlno,1,3),'-',substr(u.tlno,4,4),'-',substr(u.tlno,8,4))
from used_goods_board b join used_goods_user u on b.writer_id = u.user_id
group by b.writer_id
having count(1) >=3
order by b.writer_id desc

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

  1. FROM 절: used_goods_board 와 join used_goods_user를 b.writer_id = u.user_id기준으로 조인
  2. GROUP BY 절: writer_id로 그룹화하여 
  3. HAVING 절: count(1)가 3개 이상일 경우 필터링
  4. SELECT 절: b.writer_id, u.nickname 과 u.CITY,u.STREET_ADDRESS1,STREET_ADDRESS2를 concat으로 합치고, tlno에 xxx-xxxx-xxx형태로 substr 부분출력하여 concat을 통해 -을 기준으로 합쳐서 출력
  5. ORDER BY 절: writer_id 내림차순

다른사람 풀이

SELECT
    ugu.USER_ID,
    ugu.NICKNAME,
    CONCAT(ugu.CITY,' ',ugu.STREET_ADDRESS1,' ',ugu.STREET_ADDRESS2) AS '전체주소',
    CASE LENGTH(ugu.TLNO)
    WHEN 11 THEN CONCAT(LEFT(ugu.TLNO, 3), '-', MID(ugu.TLNO, 4, 4), '-', RIGHT(ugu.TLNO, 4))
    WHEN 10 THEN CONCAT(LEFT(ugu.TLNO, 3), '-', MID(ugu.TLNO, 4, 3), '-', RIGHT(ugu.TLNO, 4))
    END AS '전화번호'
FROM (
SELECT 
    WRITER_ID,
    COUNT(*)
FROM USED_GOODS_BOARD 
GROUP BY WRITER_ID
HAVING COUNT(*) >= 3
) AS ugb
INNER JOIN USED_GOODS_USER AS ugu
ON ugb.WRITER_ID = ugu.USER_ID
ORDER BY 1 DESC
SELECT
    USER_ID,
    NICKNAME,
    CONCAT(CITY, ' ',STREET_ADDRESS1, ' ', STREET_ADDRESS2) 전체주소,
    REGEXP_REPLACE(TLNO, '(.{3})(.{4})(.{4})', '$1-$2-$3') 전화번호
FROM
    USED_GOODS_BOARD A
    INNER JOIN USED_GOODS_USER B
        ON A.WRITER_ID = B.USER_ID
GROUP BY 
    USER_ID
HAVING 
    COUNT(USER_ID) >= 3
ORDER BY
    USER_ID DESC

 

배운점