부제:
조건에 맞는 사용자 정보 조회하기, 레벨 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 리스트를 먼저 만들어 서브쿼리에 넣음.
'SQL 알고리즘 코드카타' 카테고리의 다른 글
| SQL 알고리즘 코드카타 19일차(3) 26.01.17(토) (0) | 2026.01.17 |
|---|---|
| SQL 알고리즘 코드카타 19일차(2) 26.01.17(토) (0) | 2026.01.17 |
| SQL 알고리즘 코드카타 18일차(3) 26.01.16(금) (0) | 2026.01.16 |
| SQL 알고리즘 코드카타 18일차(2) 26.01.16(금) (0) | 2026.01.16 |
| SQL 알고리즘 코드카타 18일차(1) 26.01.16(금) (0) | 2026.01.16 |