๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ ์คํธ ์ฐ์ต,
https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle์์ ๋ฐํ๋๋ค.
· ๋ณธ ๋ฌธ์ https://school.programmers.co.kr/learn/courses/30/lessons/164670
โ ๋ฌธ์
๋ฌธ์ ์ค๋ช
๋ค์์ ์ค๊ณ ๊ฑฐ๋ ๊ฒ์ํ ์ ๋ณด๋ฅผ ๋ด์ USED_GOODS_BOARD ํ ์ด๋ธ๊ณผ ์ค๊ณ ๊ฑฐ๋ ๊ฒ์ํ ์ฒจ๋ถํ์ผ ์ ๋ณด๋ฅผ ๋ด์ USED_GOODS_USER ํ ์ด๋ธ์ ๋๋ค.
USED_GOODS_BOARD ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS๋ ๊ฒ์๊ธ ID, ์์ฑ์ ID, ๊ฒ์๊ธ ์ ๋ชฉ, ๊ฒ์๊ธ ๋ด์ฉ, ๊ฐ๊ฒฉ, ์์ฑ์ผ, ๊ฑฐ๋์ํ, ์กฐํ์๋ฅผ ์๋ฏธํฉ๋๋ค.
Column name | Type | Nullable |
BOARD_ID | VARCHAR(5) | FALSE |
WRITER_ID | VARCHAR(50) | FALSE |
TITLE | VARCHAR(100) | FALSE |
CONTENTS | VARCHAR(1000) | FALSE |
PRICE | NUMBER | FALSE |
CREATED_DATE | DATE | FALSE |
STATUS | VARCHAR(10) | FALSE |
VIEWS | NUMBER | FALSE |
USED_GOODS_USER ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ USER_ID, NICKNAME, CITY, STREET_ADDRESS1, STREET_ADDRESS2, TLNO๋ ๊ฐ๊ฐ ํ์ ID, ๋๋ค์, ์, ๋๋ก๋ช ์ฃผ์, ์์ธ ์ฃผ์, ์ ํ๋ฒํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
Column name | Type | Nullable |
USER_ID | VARCHAR(50) | FALSE |
NICKNAME | VARCHAR(100) | FALSE |
CITY | VARCHAR(100) | FALSE |
STREET_ADDRESS1 | VARCHAR(100) | FALSE |
STREET_ADDRESS2 | VARCHAR(100) | TRUE |
TLNO | VARCHAR(20) | FALSE |
๋ฌธ์
USED_GOODS_BOARD์ USED_GOODS_USER ํ ์ด๋ธ์์ ์ค๊ณ ๊ฑฐ๋ ๊ฒ์๋ฌผ์ 3๊ฑด ์ด์ ๋ฑ๋กํ ์ฌ์ฉ์์ ์ฌ์ฉ์ ID, ๋๋ค์, ์ ์ฒด์ฃผ์, ์ ํ๋ฒํธ๋ฅผ ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋, ์ ์ฒด ์ฃผ์๋ ์, ๋๋ก๋ช ์ฃผ์, ์์ธ ์ฃผ์๊ฐ ํจ๊ป ์ถ๋ ฅ๋๋๋ก ํด์ฃผ์๊ณ , ์ ํ๋ฒํธ์ ๊ฒฝ์ฐ xxx-xxxx-xxxx ๊ฐ์ ํํ๋ก ํ์ดํ ๋ฌธ์์ด(-)์ ์ฝ์ ํ์ฌ ์ถ๋ ฅํด์ฃผ์ธ์. ๊ฒฐ๊ณผ๋ ํ์ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
์ค๊ณ ๊ฑฐ๋ ๊ฒ์๋ฌผ์ 3๊ฑด ์ด์ ๋ฑ๋กํ ์ฌ์ฉ์์ ์ฌ์ฉ์ ID, ๋๋ค์, ์ ์ฒด์ฃผ์, ์ ํ๋ฒํธ๋ฅผ ์กฐํํ๋ SQL๋ฌธ์ ์์ฑ
> BOARD ํ ์ด๋ธ ๋ฐ์ดํฐ์ ๋ํด USER_ID๊ธฐ์ค์ผ๋ก ์ง๊ณํ ํ - GROUP BY
> ์ง๊ณ ๊ฒฐ๊ณผ์ ๋ํ ์กฐ๊ฑด (3๊ฑด ์ด์) ์ค์ - HAVING์
> ์ฌ์ฉ์ ์ ๋ณด์ ๋ํ ์ปฌ๋ผ(๋๋ค์, ์ ์ฒด์ฃผ์, ์ ํ๋ฒํธ)๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด BOARD ํ ์ด๋ธ ๊ธฐ์ค์ผ๋ก left join
์ ์ฒด ์ฃผ์๋ ์, ๋๋ก๋ช ์ฃผ์, ์์ธ ์ฃผ์๊ฐ ํจ๊ป ์ถ๋ ฅ๋๋๋ก ํด์ฃผ์๊ณ ,
> ๋ฐ์ดํฐํ์ ์ด ๋ฌธ์์ธ ์ปฌ๋ผ๊ฐ์ ํฉ์ณ์ผ ํ๋ฏ๋ก CONCAT(str1, str2, str3...)์ ํ์ฉ
์ ํ๋ฒํธ์ ๊ฒฝ์ฐ xxx-xxxx-xxxx ๊ฐ์ ํํ๋ก ํ์ดํ ๋ฌธ์์ด(-)์ ์ฝ์ ํ์ฌ ์ถ๋ ฅ
> ์ ํ๋ฒํธ ์ปฌ๋ผ(TLNO) ๋ํ ๋ฌธ์์ด์ด๋ฏ๋ก CONCAT()์ ์ฌ์ฉํด์ ์ถ๋ ฅํ ์ ์๋ค. ๋จ ๋ฌธ์ ์์ฒญ์ฌํญ๋๋ก '-' ๊น์ง ๋ํด์ค ๊ฒ
๊ฒฐ๊ณผ๋ ํ์ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ - ์ ๋ ฌ์กฐ๊ฑด
SELECT UGU.USER_ID , UGU.NICKNAME
, CONCAT(UGU.CITY,' ', UGU.STREET_ADDRESS1,' ', UGU.STREET_ADDRESS2) AS ์ ์ฒด์ฃผ์
, CONCAT(SUBSTR(UGU.TLNO, 1, 3), '-', SUBSTR(UGU.TLNO, 4, 4), '-', SUBSTR(UGU.TLNO, 8, 4)) AS ์ ํ๋ฒํธ
FROM USED_GOODS_BOARD UGB
LEFT JOIN USED_GOODS_USER UGU
ON UGB.WRITER_ID = UGU.USER_ID
GROUP BY 1
HAVING COUNT(*) >= 3
ORDER BY 1 DESC;
โ ๋ฌธ์ ํ๊ณ
SELECT์ ์์ ๋ฌธ์์ด ๊ฐ๊ณต์ด ๋์ด์ ์ถ๋ ฅ์ ์์ด ์ข๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์๊น ์์ํ๋ค.
ํน์ ์๊ฐ์ ์ค์ผ ์ ์๊ฑฐ๋ ์ข๋ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ ๋ถ์ ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค.
๋ค๋ฅธ ํ์ด ์ฟผ๋ฆฌ๋ ์ข์์ :)