Growth ๐ŸŒณ/Practice ๐Ÿ’ป

[Programmers] ์šฐ์œ ์™€ ์š”๊ฑฐํŠธ๊ฐ€ ๋‹ด๊ธด ์žฅ๋ฐ”๊ตฌ๋‹ˆ

์ธ” 2022. 8. 25. 17:17

 

๐Ÿ“ข ๋ณธ ํฌ์ŠคํŒ…์— ํ™œ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๋ฌธ์ œ ๋ฐ ์ž๋ฃŒ ์ถœ์ฒ˜๋Š”

       ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต, https://school.programmers.co.kr/learn/challenges ์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค.

       ์œ„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต์— ๊ณต๊ฐœ๋œ ๋ฌธ์ œ๋Š” (์ฃผ)๊ทธ๋ ™์ด ์ €์ž‘๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


โ–  ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/62284

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


โ–  ํ’€์ด

๋ฌธ์ œ ์š”๊ตฌ์‚ฌํ•ญ

๋ฐ์ดํ„ฐ ๋ถ„์„ ํŒ€์—์„œ๋Š” ์šฐ์œ (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) ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์•„์ด๋”” ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.