๊ด€๋ฆฌ ๋ฉ”๋‰ด

bom's happy life

[SQL ์ฝ”ํ…Œ] ์žฌ๊ตฌ๋งค๊ฐ€ ์ผ์–ด๋‚œ ์ƒํ’ˆ๊ณผ ํšŒ์› ๋ฆฌ์ŠคํŠธ ๊ตฌํ•˜๊ธฐ ๋ณธ๋ฌธ

Algorithm๐Ÿ’Œ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[SQL ์ฝ”ํ…Œ] ์žฌ๊ตฌ๋งค๊ฐ€ ์ผ์–ด๋‚œ ์ƒํ’ˆ๊ณผ ํšŒ์› ๋ฆฌ์ŠคํŠธ ๊ตฌํ•˜๊ธฐ

bompeach 2023. 8. 12. 16:31

Q)

ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ ๋™์ผํ•œ ํšŒ์›์ด ๋™์ผํ•œ ์ƒํ’ˆ์„ ์žฌ๊ตฌ๋งคํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌํ•˜์—ฌ, `์žฌ๊ตฌ๋งคํ•œ ํšŒ์› ID์™€ ์žฌ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ID๋ฅผ ์ถœ๋ ฅ` ํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ํšŒ์› ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์‹œ๊ณ  ํšŒ์› ID๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ƒํ’ˆ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

 

A1)

-- MYSQL
SELECT USER_ID, PRODUCT_ID 
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID ASC, PRODUCT_ID DESC
--์ฟผ๋ฆฌํ•ด์„

-- ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ
SELECT USER_ID, PRODUCT_ID 
-- ์‚ฌ์šฉ์ž ID์™€ ์ œํ’ˆ ID๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

FROM ONLINE_SALE
-- ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

GROUP BY USER_ID, PRODUCT_ID
-- ์‚ฌ์šฉ์ž ID์™€ ์ œํ’ˆ ID๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.
-- ์ด๋Š” ๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ ์ œํ’ˆ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ตฌ๋งคํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

HAVING COUNT(*) > 1
-- ๊ทธ๋ฃน ๋‚ด์—์„œ ํ–‰์˜ ์ˆ˜๊ฐ€ 1๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋งŒ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
-- ์ฆ‰, ๋™์ผํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ์ œํ’ˆ์„ 2๋ฒˆ ์ด์ƒ ๊ตฌ๋งคํ•œ ๊ทธ๋ฃน๋งŒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

ORDER BY USER_ID ASC, PRODUCT_ID DESC
-- ์‚ฌ์šฉ์ž ID๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋˜, ์ œํ’ˆ ID๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
-- ๊ฒฐ๊ณผ๋Š” ์‚ฌ์šฉ์ž ID๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜๋ฉฐ, ๋™์ผํ•œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์ œํ’ˆ ID๊ฐ€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

 

A2) ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ

-- MYSQL
SELECT DISTINCT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
WHERE (USER_ID, PRODUCT_ID) IN (
    SELECT USER_ID, PRODUCT_ID
    FROM ONLINE_SALE
    GROUP BY USER_ID, PRODUCT_ID
    HAVING COUNT(*) > 1
)
ORDER BY USER_ID ASC, PRODUCT_ID DESC;