SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_조건에 맞는 사용자 정보 조회하기

몽총한몽이네 2024. 2. 23. 01:50
반응형

SELECT USER_ID, NICKNAME, 
    CONCAT(CITY,' ',STREET_ADDRESS1,' ',STREET_ADDRESS2) as 전체주소, 
    CONCAT(left(TLNO,3),'-',mid(TLNO,4,4),'-',right(TLNO,4))전화번호
FROM USED_GOODS_BOARD as b, USED_GOODS_USER as u
WHERE b.WRITER_ID = u.USER_ID
GROUP BY 1
HAVING COUNT(USER_ID) >=3
ORDER BY 1 desc

 

문제

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

 

 기초적인 방법으로 문제를 풀이 하였다. 함수에 대한 정보가 조금 부족해서 아는 함수로 사용 했는데 CONCAT 대신 에 CONCAT_WS(연결 문자,컬럼,컬럼) 식으로 처리해도 동일한 값을 추출해 낼 수 있다고 한다.

 

 HAVING은 기본적으로 GROUP BY와 함께 움직인다고 이해하면 좋을 것 같다. 없어도 작동은 하지만 그룹이 된 값에 대한 추가 조건문을 걸고싶을 때 사용하는 경우가 대다수라 참고하면 좋다. 일단 약간 노가다(?) 성이 보이지만 CONCAT 함수로 각각의 주소+ ' '+주소+' '+ 주소의 방식으로 띄어 쓰기를 포함하여 작성하고 전화번호의 경우에는 왼쪽 3개의값 '-' 4번째 에서 4개의 값 '-' 오른쪽에서 4개의 값을 CONCAT으로 합쳐 000-0000-0000의 형태로 만들어 주었다.. 엑셀에서는 FORMAT함수를 걸어 000-0000-0000으로 그냥 처리했는데 꽤나 비효율적인 방식으로 해야해서 왜 이렇게 해야하는가.. 살짝 고민했다.

 그리고 JOIN 구문은 게시글 작성자 ID = 곧 USER ID 이기에 해당 컬럼들로 조인을 시켜주었다. 그후 USER ID 기준으로 GROUP 처리를 하였는데 이는 추출 값의 USER ID의 중복을 없앰과 동시에 같이값을 묶어주어 HAVING 절에서 COUNT 처리를 하기 위함이다. GROUP BY 1,2,3,4 를 해도 크게 무방하지만 (어차피 같은 ID의 컬럼내용은 모두 동일한 조건이다) 실제로는 ID는 같지만 나머지 내용들이 변경되어 값들이 변경 될 수 있으므로 상황에 따라 그룹도 다르게 정렬도 다르게(최근데이터 표기라던지) 해서 사용해야한다.

 

 각설하고 이렇게 GROUP 처리후 HAVING 조건문으로 필터가 완료된 값에 대해서 3건이상의 ID가 존재하는 데이터를 마지막으로 걸러낸 후 정렬하여 값을 추출 해 내면된다.

반응형