๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ ์คํธ ์ฐ์ต, https://school.programmers.co.kr/learn/challenges ์์ ๋ฐํ๋๋ค.
์ ์ฝ๋ฉํ ์คํธ ์ฐ์ต์ ๊ณต๊ฐ๋ ๋ฌธ์ ๋ (์ฃผ)๊ทธ๋ ์ด ์ ์๊ถ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
โ ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/62284
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
๋ฐ์ดํฐ ๋ถ์ ํ์์๋ ์ฐ์ (Milk)์ ์๊ฑฐํธ(Yogurt)๋ฅผ ๋์์ ๊ตฌ์ ํ ์ฅ๋ฐ๊ตฌ๋๊ฐ ์๋์ง ์์๋ณด๋ ค ํ๋ค.
์ฐ์ ์ ์๊ฑฐํธ๋ฅผ ๋์์ ๊ตฌ์ ํ ์ฅ๋ฐ๊ตฌ๋์ ์์ด๋๋ฅผ ์กฐํํ๋ SQL ๋ฌธ์ ์์ฑ
์ด๋ ๊ฒฐ๊ณผ๋ ์ฅ๋ฐ๊ตฌ๋์ ์์ด๋ ์์ผ๋ก ๋์์ผ ํ๋ค.
[ํ์ด1]
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk','Yogurt')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2;
์ฅ๋ฐ๊ตฌ๋์ 'Milk'์ 'Yogurt'๊ฐ ์๋ CART_ID๋ฅผ ์ถ๋ ฅํ๊ณ CART-ID๋ณ๋ก ๊ทธ๋ฃนํํด์ค๋ค.
'Milk'์ 'Yogurt'๊ฐ ๊ฐฏ์์ ์๊ด์์ด ์ต์ 1๊ฐ์ฉ ๋์์ ๋ค์ด์์ผ๋ฉด ๋๋ค.
๊ทธ๋ฐ๋ฐ CART_ID๋ก ๊ทธ๋ฃนํํด๋ณด๋ฉด,
SELECT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME IN ('Milk','Yogurt');
์๋ CART_ID 830 ์ฒ๋ผ Milk์ Yogurt์ค ํ๋๊ฐ 2๊ฐ์ง ์ด์ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ฃนํ ํ์ ๋ ์ถ์ถ๋๋ ๊ฒ์ ํํฐ๋ง ํ๊ธฐ ์ํด
HAVING์ ๋ก ์ฅ๋ฐ๊ตฌ๋ ์ ๋ฌผ๊ฑด ๊ฐฏ์๋ฅผ COUNT ํ๋๋ฐ ์ค๋ณต ์์ด ๊ฐ์๊ฐ 2๊ฐ ์ด์(Milk 1, Yogurt 1)์ด ๋๋๋ก ํด์คฌ๋ค.
[ํ์ด2]
์๋ก์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ
group_concat()
This function returns a string with concatenated non-NULL value from a group.
> 1๋จ๊ณ
SELECT CART_ID, GROUP_CONCAT(NAME)
FROM CART_PRODUCTS
GROUP BY CART_ID;
CART_ID | GROUP_CONCAT(NAME) |
83 | Cereal,Multipurpose Supply,Vegetable,Sausages,Vegetable,Toilet Paper,Pork,Disposable Tableware,Facial Tissue,Toilet Paper,Hair Care,Coffee,Hair Care,Tea,Party Tray,Beef |
195 | Coffee,Ketchup,Pasta,Snack,Trash Bag,Laundry Care,Soap |
286 | Air Fresheners,Party Tray,Ketchup,Yogurt,Disposable Tableware,Soda and Pop,Frozen Food,Beef,Hair Care,Pork,Salad,Disposable Tableware,Pasta,Diaper,Vegetable,Vegetable,Milk,Toilet Paper,Facial Tissue,Facial Tissue |
287 | Facial Tissue,Dish Detergent,Vegetable,Laundry Care,Canned Food,Sausages,Coffee,Fruit,Frozen Food,Disposable Tableware,Milk,Cereal,Cereal,Salad,Vegetable,Canned Food,Vegetable,Sausages |
301 | Ice Cream,Ice Cream,Multipurpose Supply,Trash Bag,Trash Bag,Soap,Butter,Sausages,Frozen Food,Coffee,Coffee,Salad,Sausages |
448 | Flour,Toilet Paper,Milk,Laundry Care,Yogurt,Tea,Ice Cream,Soap,Hair Care,Pasta,Cereal,Cereal,Salad,Flour,Vegetable,Butter,Vegetable,Pork,Soap,Diaper,Ketchup,Milk,Hair Care |
514 | Snack,Vegetable,Sausages,Hair Care,Snack,Vegetable,Cheese,Vegetable,Sausages |
> 2๋จ๊ณ
์ด ๊ฒฐ๊ณผ๋ฅผ FROM์ ์ ์๋ธ์ฟผ๋ฆฌ์ ๋ฃ์ด์ฃผ๊ณ names ( GROUP_CONCAT(NAME) ) ์ ๋ํด 'Milk'์ Yogurt ๋ฌธ์์ด์ ํฌํจํ๊ณ ์๋ ์กฐ๊ฑด์ ๋ถ์ฌํ๋ฉด ๋ฌธ์ ๊ฐ ์๊ตฌํ๋ CART_ID๊ฐ ์ถ๋ ฅ๋๋ค.
(* ๋จ GROUP_CONCAT()์ ๊ทธ๋ฃนํ ๋ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ Null๊ฐ์ ์ ์ธํ๊ณ ์ฐ๊ฒฐ๋ ๋ฌธ์์ด๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ์ฐพ์๋ LIKE๋ฅผ ์จ์ผํ๋ค)
SELECT CART_ID
FROM (SELECT CART_ID, GROUP_CONCAT(NAME) names
FROM CART_PRODUCTS
GROUP BY 1) A
WHERE names LIKE '%Milk%'
AND names LIKE '%Yogurt%';
[ํ์ด3]
SELECT cart_id
FROM (SELECT cart_id
FROM cart_products
WHERE name LIKE 'Milk') Milk_O
WHERE cart_id IN (SELECT cart_id
FROM cart_products
WHERE name LIKE 'Yogurt') -- (1)
GROUP BY 1 -- (2)
ORDER BY 1; -- (3)
์ฅ๋ฐ๊ตฌ๋์ Milk๋ฅผ ํฌํจํ๊ณ ์๋ Cart_id๋ฅผ ์ถ๋ ฅํ๋ค > ํ ์ด๋ธ Milk_O
ํ ์ด๋ธ Milk_O ์์ Cart_id๋ฅผ ์์ฑํ๋๋ฐ ์๋ ์กฐ๊ฑด์ ๋ถ์ฌํ๋ค.
> Cart_id๋ ๊ธฐ์กด cart_products ํ ์ด๋ธ์์ Yogurt๋ฅผ ๊ฐ์ง๊ณ ์๋ Cart_id ์ค์ ์์ด์ผ ํ๋ค.
(1) ์ฌ๊ธฐ๊น์ง๋ง ์ถ๋ ฅํ๋ฉด, Milk๋ฅผ ๊ฐ์ง๊ณ ์๋ CART_ID๊ฐ ๋๋ฒ์ด์๋ค๋ฉด, ๋๋ฒ ๋ชจ๋ ์ถ๋ ฅ๋๋ค.
๋ฐ๋ผ์ (2)๋ก CART_ID ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํด์ฃผ๊ณ ,
๋ฌธ์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ (3) ์ฅ๋ฐ๊ตฌ๋ ์์ด๋ ์์ผ๋ก ์ถ๋ ฅํ๋ค.
'Growth ๐ณ > Practice ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 1179. Reformat Department Table (0) | 2022.08.26 |
---|---|
[LeetCode] 262. Trips and Users (0) | 2022.08.26 |
[Programmers] ์ ์ ์๊ฐ ๊ตฌํ๊ธฐ(2) (1) | 2022.08.25 |
[LeetCode] 184. Department Highest Salary (0) | 2022.08.25 |
[Programmers] ์ค๋ ๊ธฐ๊ฐ ๋ณดํธํ ๋๋ฌผ(2) (1) | 2022.08.25 |