๋ฌธ์ œ

๐Ÿ“Œ MySQL ๋กœ ํ’€์ด

 

๐Ÿ“Œ ๋ฌธ์ œ ๋งํฌ :

 

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

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

programmers.co.kr

 

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช… :

CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์—์„œ ๋Œ€์—ฌ ์‹œ์ž‘์ผ์„ ๊ธฐ์ค€์œผ๋กœ 2022๋…„ 8์›”๋ถ€ํ„ฐ 2022๋…„ 10์›”๊นŒ์ง€ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ 5ํšŒ ์ด์ƒ์ธ ์ž๋™์ฐจ๋“ค์— ๋Œ€ํ•ด์„œ ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ์›”๋ณ„ ์ž๋™์ฐจ ID ๋ณ„ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜(์ปฌ๋Ÿผ๋ช…: RECORDS) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ์›”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , ์›”์ด ๊ฐ™๋‹ค๋ฉด ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”. ํŠน์ • ์›”์˜ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฒฐ๊ณผ์—์„œ ์ œ์™ธํ•ด์ฃผ์„ธ์š”.

 

๐Ÿ“Œ ํ…Œ์ด๋ธ” :

๋‹ค์Œ์€ ์–ด๋Š ์ž๋™์ฐจ ๋Œ€์—ฌ ํšŒ์‚ฌ์˜ ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก ์ •๋ณด๋ฅผ ๋‹ด์€ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, HISTORY_ID, CAR_ID, START_DATE, END_DATE ๋Š” ๊ฐ๊ฐ ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก ID, ์ž๋™์ฐจ ID, ๋Œ€์—ฌ ์‹œ์ž‘์ผ, ๋Œ€์—ฌ ์ข…๋ฃŒ์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

 


ํ’€์ด

์ถ”์ธก) 

์˜ˆ์•ฝํ•œ ๋‚ ์˜ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๋จผ์ € ํ•„ํ„ฐ๋งํ•ด์„œ ROW์ˆ˜๋ฅผ ์ค„์ด๊ณ ,

๊ทธ 3๊ฐœ์›” ์•ˆ์— 5๋ฒˆ ์ด์ƒ์ธ CAR_ID๋ฅผ ์งˆ์˜ํ•œ ํ›„์— 

๊ทธ CAR_ID ๋Œ€์ƒ์œผ๋กœ ROW์ˆ˜๋ฅผ ์ค„์ธ ๊ฒฐ๊ณผ์—์„œ ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ์„ ๋‹ฌ๊ธฐ์ค€, ์ฐจ๊ธฐ์ค€์œผ๋กœ GROUPํ™” ์‹œ์ผœ ๊ทธ๋ฃน ํ•จ์ˆ˜ ์นด์šดํŠธ๋กœ๋‹ฌ๋งˆ๋‹ค ๋ช‡๋ฒˆ ๋ ŒํŠธ๊ฐ€ ๋ฌ๋Š”์ง€ ์งˆ์˜ํ•˜๋ฉด ๋  ๋“ฏํ•˜๋‹ค. 

 

์ฟผ๋ฆฌ) 

* 1์ฐจ) 

WITH F AS 
(
SELECT HISTORY_ID, CAR_ID, MONTH(START_DATE) AS MONTH
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE DATE_FORMAT(START_DATE,'%Y-%m-%d') BETWEEN '2022-08-01' AND '2022-10-31'
)

SELECT MONTH, CAR_ID, COUNT(CAR_ID) AS RECORDS
FROM F
WHERE CAR_ID IN (SELECT CAR_ID 
                 FROM F 
                 GROUP BY CAR_ID
                 HAVING COUNT(CAR_ID) >= 5)
GROUP BY MONTH, CAR_ID
ORDER BY MONTH ASC, CAR_ID DESC

* 2์ฐจ) ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ JOIN์œผ๋กœ ๊ต์ฒด

WITH F AS 
(
SELECT HISTORY_ID, CAR_ID, MONTH(START_DATE) AS MONTH
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE DATE_FORMAT(START_DATE,'%Y-%m-%d') BETWEEN '2022-08-01' AND '2022-10-31'
)

SELECT F.MONTH, F.CAR_ID, COUNT(F.CAR_ID) AS RECORDS
FROM F
INNER JOIN (SELECT CAR_ID 
            FROM F 
            GROUP BY CAR_ID
            HAVING COUNT(CAR_ID) >= 5) AS A
ON F.CAR_ID = A.CAR_ID
GROUP BY F.MONTH, F.CAR_ID
ORDER BY F.MONTH ASC, F.CAR_ID DESC

 

 

๋ฆฌ๋ทฐ) 

ํ•˜๋‹ค ๋ณด๋‹ˆ "2022๋…„ 8์›”๋ถ€ํ„ฐ 2022๋…„ 10์›”๊นŒ์ง€ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ 5ํšŒ ์ด์ƒ์ธ ์ž๋™์ฐจ๋“ค์— ๋Œ€ํ•ด์„œ ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ์›”๋ณ„ ์ž๋™์ฐจ ID ๋ณ„ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜(์ปฌ๋Ÿผ๋ช…: RECORDS) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅ" ์ด๋ถ„์—์„œ 8์›”๋ถ€ํ„ฐ 10์›”๊นŒ์ง€์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‘๋ฒˆ ์จ์•ผํ•  ์ผ์ด ์ƒ๊ฒผ๋‹ค.

 

3๊ฐœ์›”๊ฐ„ ์ด 5ํšŒ ๋ ŒํŠธ๋œ ์ฐจ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ํ•œ๋ฒˆ

3๊ฐœ์›”๊ฐ„ ๊ธฐ๋ก์„ ๋‹ฌ๋งˆ๋‹ค ์ฐจ๋งˆ๋‹ค ๋ ŒํŠธ ์นด์šดํŠธ ํ•ด์ค„ ๋•Œ ํ•œ๋ฒˆ

 

๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—” ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์จ์„œ 2๋ฒˆ ๋ฐ˜๋ณต์•ˆํ•˜๊ณ  ํ•œ๋ฒˆ์˜ ๊ฒฐ๊ณผ๋ฌผ๋กœ SELECT๋ฌธ์— ๋‘๋ฒˆ ์“ฐ๋Š” ๊ฑธ๋กœ!

+ Recent posts