SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 19일차(1) 26.01.17(토)

nom_de_plume 2026. 1. 17. 13:42

부제:

조건에 맞는 사용자 정보 조회하기, 레벨 4

 

1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/164670
2. 정답 코드: 

=> JOIN 활용

SELECT
    ugu.user_id,
    ugu.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_board as ugb
inner join used_goods_user as ugu
    on ugb.writer_id = ugu.user_id
group by ugb.writer_id
having count(ugb.writer_id) >= 3
order by ugu.user_id desc;

=> 서브쿼리 활용

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 user_id IN (
    SELECT writer_id
    FROM used_goods_board
    GROUP BY writer_id
    HAVING COUNT(*) >= 3
)
ORDER BY user_id DESC;


3. 오류 상황:

SELECT
    ugu.user_id,
    ugu.nickname,
    (street_address1 + street_address2) as '전체주소',
    tlno as '전화번호'
from used_goods_board as ugb
inner join used_goods_user as ugu
    on ugb.writer_id = ugu.user_id
having count(ugb.writer_id) >= 3
order by ugu.user_id desc;

=> GROUP BY 누락

=> 문자열 합치는 방법 오류

SELECT
    ugu.user_id,
    ugu.nickname,
    '전체주소',
    tlno as '전화번호'
from used_goods_user as ugu
where (street_address1, street_address2) in (
    select 
        street_address1 + street_address2 as '전체주소'
    from used_goods_board as ugb
    where ugb.writer_id = ugu.user_id
    order by ugu.user_id desc
)
having count(ugb.writer_id) >= 3;

=> WHERE절 안에 서브쿼리 오류


4. 시도 방법:

=> CONCAT() 활용

=> SUBSTR() 활용

=> GROUP BY 누락

 

=> 서브쿼리 수정


5. 최종 문제 해결 방법:

=> SQL에서 HAVING은 보통 GROUP BY로 그룹화된 결과에 조건을 걸 때 사용. GROUP BY로 "무엇을 기준으로 개수를 셀 것인가"를 먼저 알려줘야하므로 '작성자ID'를 기준으로 그룹화한다.

=> CONCAT() 함수를 사용하여 시, 도로명 주소, 상세 주소를 합함. 주소 사이에 공백도 포함

=> 전화번호 중간에 하이픈(-)을 넣으려면 SUBSTR(또는 SUBSTRING) 함수를 사용해 문자열을 자른 뒤 다시 합침.

 

=> 작성했던 서브쿼리 코드는 "비교하는 대상"이 서로 맞지 않아서 계속 막히는 현상 발생. 3건 이상 게시글을 쓴 사람의 ID 리스트를 먼저 만들어 서브쿼리에 넣음.