코딩테스트 연습 - 조건에 맞는 사용자 정보 조회하기 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
사실 이 문제에서 핵심은 CONCAT_WS() 함수인데,
나는 정답을 맞추고 다른 분들의 풀이를 보고 충격먹었다...
우선 CONCAT_WS() 함수는 CONCAT()에서 Seperator를 제공하는 것이다.
가령, CONCAT_WS(SEPERATOR, STRING1, STRING2) 라고 하면
STRING1 + SEPERATOR + STRING2 로 연결된 값을 출력해 준다.. 이거완전 럭키비키 잖아?
하지만, 나는 조인에 너무 꽂혔던 걸까... 아래 답안은 내가 작성한 것...
SELECT USER_ID, NICKNAME, CONCAT_WS(' ',CITY,STREET_ADDRESS1,STREET_ADDRESS2) AS '전체주소',
CONCAT_WS('-',SUBSTR(TLNO,1,3),SUBSTR(TLNO,4,4),SUBSTR(TLNO,8,4)) AS '전화번호'
FROM
(SELECT WRITER_ID, COUNT(*)
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID HAVING COUNT(*) >= 3) AS A
LEFT JOIN
(SELECT *
FROM USED_GOODS_USER) AS B
ON A.WRITER_ID = B.USER_ID
ORDER BY USER_ID DESC;
허나, 인라인뷰를 통한 조인 말고 아래 처럼 WHERE 절 서브쿼리도 가능하다. (신선한 충격)
다만, WHERE 절 서브쿼리는 매 ROW를 읽을 때마다 서브쿼리가 돌아가므로 성능상 추천하지 않는다고 한다.(레알?)
SELECT USER_ID, NICKNAME,
CONCAT(CITY,' ',STREET_ADDRESS1,' ',STREET_ADDRESS2) AS 전체주소,
CONCAT(SUBSTR(TLNO, 1, 3), '-', SUBSTR(TLNO, 4, 4), '-', SUBSTR(TLNO, 8, 4)) AS 전화번호
FROM USED_GOODS_USER
WHERE (
SELECT COUNT(*) FROM USED_GOODS_BOARD
WHERE USER_ID = WRITER_ID) >= 3
ORDER BY USER_ID DESC
짜잔,,, 그래서 아래와 같은 답안도 있다. 아직 본 캠프에서 해당 문법을 배우진 않았지만,, 뭔가 FANCY하다..
CTE라고 WITH (TABLE_CTE) AS (QUERY) 로 작성을 한 뒤, (마치 파이썬의 함수 같은 기능인 것 같다.)
아래 답안 예시 처럼 WHERE 절에 서브쿼리로 불러온다..
(근데, 어쩃던 CTE도 테이블을 불러오는 거니까 위에 꺼랑 cpu를 잡아 먹는건 매한가지 아닌가?? 크흠..)
WITH USER_CTE AS (
SELECT WRITER_ID
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID
HAVING COUNT(*) >= 3
)
SELECT
USER_ID,
NICKNAME,
CONCAT_WS(' ', CITY, STREET_ADDRESS1, STREET_ADDRESS2) 전체주소,
CONCAT_WS('-', SUBSTRING(TLNO, 1, 3), SUBSTRING(TLNO, 4, 4), SUBSTRING(TLNO, 8, 4)) 전화번호
FROM USED_GOODS_USER
WHERE USER_ID IN (SELECT *
FROM USER_CTE
)
ORDER BY 1 DESC
요것들은 나중에 튜터님께 문의드려봐야겠다.
다만, 실무에선 잘 안쓰는거 같기도 하고
'SQL 이것저것' 카테고리의 다른 글
[MySQL] 전체 자료 중 특정 시점에서 현황 파악하기 (2) | 2024.10.14 |
---|---|
[MySQL] 더블 조인이 가능하다?? (3) | 2024.10.11 |
[MySQL] 데이터 내 중복 값들을 가진 인스턴스만 추출하기 (2) | 2024.10.10 |
[MySQL] 서브쿼리를 이용한 그룹 내 max 값만 뽑아오기 (0) | 2024.10.10 |
[MySQL] DATEDIFF(), TIMESTAMPDIFF() (0) | 2024.10.09 |