μƒˆμ†Œμ‹

Database

[MySQL] WITH RECURSIVE

  • -
728x90
WITH RECURSIVE

πŸ“Œ 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 59413 번 문제λ₯Ό ν’€λ‹€κ°€ 0μ‹œλΆ€ν„° 23μ‹œκΉŒμ§€μ˜ λͺ¨λ“  μ‹œκ°„μ— λŒ€ν•œ COUNT λ₯Ό ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ 생겼닀. μ–Έμ–΄λ‘œ κ·Έκ±Έ κ΅¬ν˜„ν•˜λŠ” 것은 λ‹¨μˆœ for() λ₯Ό μ‚¬μš©ν•΄μ„œ μ²˜λ¦¬ν•˜λŠ” λ“±μ˜ λ‹€μ–‘ν•œ 방법이 μžˆμ§€λ§Œ SQL μ—μ„œλŠ” μ–΄λ– ν•œ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„μ„ ν•΄μ•Ό ν•  지 λ§‰λ§‰ν–ˆλ‹€. UNION 으둜 ν•΄κ²°ν•  μˆ˜λŠ” μžˆμ§€λ§Œ 예쁜 μ½”λ“œ? κ°€ μ•„λ‹Œ 것 κ°™μ•„ λ‹€μ–‘ν•œ 풀이λ₯Ό 찾아보닀 with recursive λΌλŠ” κΈ°λŠ₯을 찾게 λ˜μ—ˆλ‹€. 좔후에도 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμ„ 것 κ°™μ•„ μ •λ¦¬ν•˜κ³  λ„˜μ–΄κ°€κ³ μž 이 글을 μž‘μ„±ν•œλ‹€.

 

πŸ“š WITH RECURSIVE

MySQLμ—μ„œ μ œκ³΅ν•˜λŠ” WITH RECURSIVE ꡬ문은 말 κ·ΈλŒ€λ‘œ μž¬κ·€ν•¨μˆ˜μ²˜λŸΌ λ™μž‘ν•œλ‹€.

WITH RECURSIVE 생성할_λ·°_이름 AS
(
	초기_SQL
    
    	UNION ALL

	λ°˜λ³΅ν• _SQL_λ°˜λ³΅μ„_멈좜_WHERE절_포함
)

 

ꡬ성은 μœ„μ™€ κ°™λ‹€. μ΄λ ‡κ²Œ λ¬Έλ²•λ§Œ λ³΄κΈ°μ—λŠ” 이해가 μ–΄λ €μš°λ‹ˆ λͺ‡κ°€μ§€ μ˜ˆμ‹œλ₯Ό 톡해 μ‚¬μš©λ²•μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž

 

⭐ μ‚¬μš©λ²•

----------------
| col1 |  col2 |
----------------
|  1   |   2   |
|  3   |   4   |
----------------

μœ„μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ WITH RECURSIVE λ₯Ό μ‚¬μš©ν•΄λ³΄μž

 

WITH cte (col1, col2) AS
(
  SELECT 1, 2
  UNION ALL
  SELECT 3, 4
)
SELECT col1, col2 FROM cte;

μž„μ‹œ ν…Œμ΄λΈ”λͺ… (컬럼, ..) AS 둜 지정해쀀닀.

WITH cte AS
(
  SELECT 1 AS col1, 2 AS col2
  UNION ALL
  SELECT 3, 4
)
SELECT col1, col2 FROM cte;

AS 둜 직접 μ»¬λŸΌμ„ μ§€μ •ν•΄μ€˜λ„ λœλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ 0 ~ 23 κΉŒμ§€λ₯Ό λ‚˜νƒ€λ‚΄λ €λ©΄ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ©΄ 될까 ? 

WITH RECURSIVE cte (HOUR) AS
(
    SELECT 0
    UNION ALL
    SELECT HOUR + 1 FROM cte WHERE HOUR < 23
)

 

μœ„μ—μ„œμ˜ SQL 처럼 HOUR μ΄λΌλŠ” μ»¬λŸΌμ„ 지정해주고 HOUR 이 23보닀 μž‘μ„ λ•ŒκΉŒμ§€ μž¬κ·€ ν˜ΈμΆœμ„ ν•΄μ€€λ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

 

κ°„λ‹¨ν•œ μ‚¬μš©λ²•κΉŒμ§€ μ•Œμ•„λ΄€μœΌλ‹ˆ ν•΄κ²°ν•˜μ§€ λͺ»ν–ˆλ˜ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 문제λ₯Ό ν’€μ΄ν•΄λ³΄μž.

 

 

πŸ“š ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€, 59413

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

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

μš”κ΅¬μ‚¬ν•­

: ANIMAL_OUTS ν…Œμ΄λΈ”μ—μ„œ μ‹œκ°„ 별 μž…μ–‘ 건을 좜λ ₯.

 

풀이

WITH RECURSIVE T (HOUR) AS
(
    SELECT 0
    UNION ALL
    SELECT HOUR + 1 FROM T WHERE HOUR < 23
)

0 ~ 23κΉŒμ§€μ˜ μ‹œκ°„μ„ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” μž„μ‹œ ν…Œμ΄λΈ”, Tλ₯Ό μƒμ„±ν•œλ‹€.

WITH RECURSIVE T (HOUR) AS
(
    SELECT 0
    UNION ALL
    SELECT HOUR + 1 FROM T WHERE HOUR < 23
)

SELECT t.HOUR AS HOUR, COUNT(a.ANIMAL_ID) AS COUNT
FROM T t
LEFT JOIN ANIMAL_OUTS a
ON t.HOUR = HOUR(a.DATETIME)
GROUP BY HOUR
ORDER BY HOUR ASC

ν•˜λ‚˜ν•˜λ‚˜ ν’€μ΄ν•΄λ³΄μž. COUNT λ₯Ό ν•΄μ•Ό ν•œλ‹€. 기쀀이 λ˜λŠ” T ν…Œμ΄λΈ” 말고 ANIMAL_OUTS 에 컬럼이 μ—†λŠ” κ²½μš°λ„ 있기 λ•Œλ¬Έμ— INNER JOIN 이 μ•„λ‹Œ LEFT JOIN 을 ν•΄μ•Ό ν•œλ‹€. (COUNT = 0 의 경우) κ·Έλ ‡κΈ° λ•Œλ¬Έμ— COUNT 의 κΈ°μ€€μ˜ ANIMAL_OUTS ν…Œμ΄λΈ”μ˜ ANIMAL_ID둜 μž‘μ•„μ€¬λ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ μ •λ ¬λ§Œ ν•΄μ£Όλ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

 

728x90
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.