MySQL ์ฌํ๋ฌธ์ ํ์ด๋ณด๊ธฐ๐
์ฝ๋ฉํ ์คํธ ๋งํฌ๐ https://school.programmers.co.kr/learn/challenges
๋ฌธ์ ๋ฅผ ํธ๋ ์ง์ ๋ถํ ๊ณผ์ ์ ๋ชจ๋ ์๋ตํ ํด-๋ฆฐํ ๋ฒ์ ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ ๋๋ ์๋ผ ํ๋ฉด์ SQL์ ์ข์ ํ์ง ๋ง๊ณ
๋ค๊ฐ์ด ํ์ดํ
๐ฅ
์ ๋ ์ชผ๋ ์ด์ง๋ง ์ด์ฌํ ํ์ด๋ณด์์ต๋๋ค.
์ ์์ ์์.
ํ๋ก๊ทธ๋๋จธ์ค LV3 ๋ฌธ์ ไธญ
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID -- ์
์์ ๊ฐ์ง ๋ชปํ ๋๋ฌผ ๊ตฌํ๊ธฐ
WHERE O.DATETIME IS NULL
ORDER BY I.DATETIME -- ๋ณดํธ ์์์ผ ์์ผ๋ก ์ ๋ ฌ
LIMIT 3;
์ผ๋จ ์ด ๋ฌธ์ ๋ ์
์์ ๊ฐ์ง ๋ชปํ ๋๋ฌผ ์ค
๋ณดํธ๋ฅผ ์ค๋ ํ 3๋ง๋ฆฌ์ ๋๋ฌผ์ ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ง์ผ ํ๋ค.
๋จผ์ ์ ์์ ๊ฐ์ง ๋ชปํ ๋๋ฌผ์ ์กฐํํ๋ ค๋ฉด
์ด ๋ ๋๋ DATETIME์ ๊ธฐ์ค์ผ๋ก OUTํ
์ด๋ธ์ ์๋ค ์๋ค๋ฅผ ํ๋จํ๋๋ฐ,
OUTํ
์ด๋ธ์ ANIMAL_ID ๋ฑ๋ ์๊ธฐ์ ์๋ฌด๊ฑฐ๋ ์จ๋ ๋ฌด๋ฐฉํ ๋ฏ ํ๋ค.
๋จ, NULL๊ฐ์ด ์๋ NAME ์ปฌ๋ผ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ค๋๋ผ...
์ด๋ ๊ฒ ๊ตฌํด์ง ์ ์์ ๊ฐ์ง ๋ชปํ ๋๋ฌผ ๋ชฉ๋ก์
+) ์ ๋ ฌ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ํ๋ฉด ํ์ N๊ฐ๋ ๋ฝ์ ์ ์๋ค.
SELECT ID, NAME, HOST_ID
FROM PLACES P1
WHERE HOST_ID IN (SELECT HOST_ID
FROM PLACES P2
GROUP BY HOST_ID
HAVING COUNT(*) >= 2)
ORDER BY ID;
์ด ๋ฌธ์ ๋ ์ฅ์๋ฅผ 2๊ฐ ์ด์ ์์ ํ ํค๋น์ ์ ์
ํธ์คํธ ์์ด๋์ ์ฅ์ ์์ด๋๋ฅผ ์กฐํํด์ผ ํ๋ ๋ฌธ์ ๋ค.
์ฒ์์๋ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ฃ์ง ์๊ณ
๊ทธ๋ฅ ํธ์คํธ ์์ด๋๋ก GROUP BY ํ๋ฉด ์ฅ์ ์ซ ๋์ค์ง ์์๊น?
ํ๋ ์์ผํ ์๊ฐ์ ํ์๋ค ^.^
ํ์ง๋ง SQL์ ์ฝ์ง ์์ง...
๊ทธ๋ ๊ฒ ์์ฑํ๋ฉด 2๊ฐ ์ด์์ ๊ณต๊ฐ์ ๋ฑ๋กํ ํค๋น์ ์ ์
์ฅ์ ์ค ์์ 1๊ฐ๋ง ์กฐํ๋์๋ค.
๊ทธ๋์ ์กฐ๊ฑด์ ๋๊ฐ๋ก ๋๋ ์,
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O
INNER JOIN ANIMAL_INS I
ON O.ANIMAL_ID = I.ANIMAL_ID
-- IN, OUTํ
์ด๋ธ์ ์กฐ์ธํ์ฌ DATETIME ๊ฐ ์ฐจ๋ฅผ ๊ตฌํ ์ ์๋๋ก ํจ
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
-- ๋ณดํธ๊ธฐ๊ฐ์ด ๊ธด ์์ผ๋ก ์ ๋ ฌ ํ
LIMIT 2; -- ์์ ๋ ๋ง๋ฆฌ๋ง ์กฐํํ๋ค.
์ด ๋ฌธ์ ๋ ์
์ ๊ฐ ๋๋ฌผ ์ค ๋ณดํธ๊ธฐ๊ฐ,
์ฆ ๋ณดํธ์์์ผ๊ณผ ์
์์ผ์ ์ฐจ์ด๊ฐ ๊ฐ์ฅ ๊ธด ๋ ๋ง๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
์ฒซ ๋ฌธ์ ์ ์ ์ฌํ๊ฒ,
์
์ ๊ฐ ๋๋ฌผ์ ๊ตฌํ๊ธฐ ์ํด์๋ OUTํ
์ด๋ธ๊ณผ INํ
์ด๋ธ์ ์กฐ์ธํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด OUTํ
์ด๋ธ์ ์๋(์
์์ ๊ฐ์ง ๋ชปํ) ๋๋ฌผ๋ค์
INNER JOIN์ด๋ผ๋ ์กฐ๊ฑด ๋๋ฌธ์ ๋ชฉ๋ก์์ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
์ฒ์์ ํ ๋๋ DATEDIFF ํจ์๋ฅผ ์ฌ์ฉํ ์ฟผ๋ฆฌ๋ฅผ
SELECT๋ FROM์ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ฃ์ด๋ณด๋ ค๊ณ ์ ๋ฅผ ์ผ์ผ๋...
๋ค์ ์๊ฐํด๋ณด๋ ๋ฐ๋ณด๊ฐ์ ์ง์ด์๋ค.
ใ
ใ
์ด์ฐจํผ DATEDIFF๋ฅผ ํ์ํด์ผํ๋ ๊ฒ๋ ์๋๊ณ
๊ฐ์ ๊ตฌํด์ ์ ๋ ฌํ๊ธฐ๋ง ํ๋ฉด ๋๋๊น ORDER BY์ ์ง๊ณํจ์๋ก ๋ฃ์๋ค.
(๋จธ์ฑ)
์ฌ๊ธฐ์๋ ORDER BY์ LIMIT ์ผ๋ก ์์ ๋ ๋ง๋ฆฌ๋ฅผ ์กฐํํ๋ค.
ํ๋ก๊ทธ๋๋จธ์ค LV4 ๋ฌธ์ ไธญ
SELECT DISTINCT A.CART_ID
FROM (SELECT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME = 'Milk') A
INNER JOIN -- ๊ต์งํฉ์ ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋์กฐ์ธ ์ฌ์ฉ
(SELECT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt') B
ON A.CART_ID=B.CART_ID
ORDER BY CART_ID
์ด ๋ฌธ์ ๋ ์ฐ์ ์ ์๊ฑฐํธ๊ฐ ํจ๊ป ๋ค์ด๊ฐ ์๋
์ฅ๋ฐ๊ตฌ๋์ ์์ด๋๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๋ง๋งํ IN() ๊ฐ์ ๊ฒ๋ ์จ๋ดค๋๋ฐ ์๋๊ณ ,
์ ์ฒด์ ์ผ๋ก ์ด๋ป๊ฒ ํด์ผํ๋ ๋ง๋งํ๋ค.
์ฌ๋ฌ๊ฐ์ง ์๊ฐํด๋ณด๋ ์์ค
ํ๋ ์๊ฐ์ด ๋ค๋ฉด์ ํ๋ ธ๋ค.
๊ทผ๋ฐ ๊ทธ์์ค์ CART_ID๋ ๊ฐ์๋ฐ ID๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ด์
CART_ID๊ฐ ๋๊ฐ์ฉ ๋ค์ด๊ฐ์๊ธฐ๋ ํ๋๋ผ.
๊ทธ๋์ DISTINCT๋ก ์ค๋ณต๋ ์ ๊ฑฐํด์ฃผ์๋ค. ์ฝ์ง ์๋ค...
LEVEL 3,4 ๋ ์ด์ฐ์ ์ฐ ํ๊ธด ํ์ง๋ง
์ด๋ฐ ๋
ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์๊ฐํด๋ด๋ ๊ฒ ์ฌ์ ํ ๋๋ฌด ์ด๋ ต๋ค.
๊ทผ๋ฐ ๋ญ ์ด๋กํด ํด์ผ์ง๐ฅ
๊ฒฐ๋ก : ๋ค ์ธ์๋? ์ด์ ํ ์ผ์ ํ์.