April 16, 2021
Menu
(조건) id값은 VARCHAR로 설정
CREATE TABLE `recursion_test` (
`id` VARCHAR(45) NULL DEFAULT NULL COLLATE 'utf8mb4_0900_ai_ci',
`m_name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_0900_ai_ci',
`depth` INT(10) NULL DEFAULT NULL,
`parent` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_0900_ai_ci',
`m_order` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_0900_ai_ci'
)
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;🧨단점)
Menu(Root)
| id | m_name | depth | parent | m_oder |
|---|---|---|---|---|
| ROOT | MENU | 0 | (NULL) | 0 |
| M0 | 축구 | 1 | ROOT | 0 |
| M1 | 농구 | 1 | ROOT | 1 |
| M2 | 야구 | 1 | ROOT | 2 |
| M00 | 세리에A | 2 | M0 | 0 |
| M01 | K-LEAGUE | 2 | M0 | 1 |
| M10 | NBA | 2 | M1 | 0 |
| M11 | KBL | 2 | M1 | 1 |
| M02 | 프리메라리그 | 2 | M0 | 2 |
| M20 | MLB | 2 | M2 | 0 |
| M21 | KBO | 2 | M2 | 1 |
WITH RECURSIVE 문 사용
WITH 은 가상 테이블(임시) 생성 위해RECURSIVE 은 재귀구현을 위해WITH RECURSIVE 규칙
anchor 역할임. 이것 미만의 계층구조로 연결되어 있는 것들 다 나옴)메뉴(ROOT)에 해당하는 계층 구조 다 확인)SET @var = 'ROOT';
WITH RECURSIVE t3 (id, m_name, depth, parent, m_order) AS
(
SELECT t1.id, t1.m_name, t1.depth, t1.parent, t1.m_order
FROM practice.recursion_test t1
WHERE t1.parent = @var
UNION ALL
SELECT t2.id, t2.m_name, t2.depth, t2.parent, t2.m_order
FROM practice.recursion_test t2
INNER JOIN t3 ON t2.parent = t3.id
)
SELECT * FROM t3
ORDER BY t3.id, t3.`m_order`;결과는?
| id | m_name | depth | parent | m_oder |
|---|---|---|---|---|
| M0 | 축구 | 1 | ROOT | 0 |
| M00 | 세리에A | 2 | M0 | 0 |
| M01 | K-LEAGUE | 2 | M0 | 1 |
| M02 | 프리메라리그 | 2 | M0 | 2 |
| M1 | 농구 | 1 | ROOT | 1 |
| M10 | NBA | 2 | M1 | 0 |
| M11 | KBL | 2 | M1 | 1 |
| M2 | 야구 | 1 | ROOT | 2 |
| M20 | MLB | 2 | M2 | 0 |
| M21 | KBO | 2 | M2 | 1 |
축구(M0)에 해당하는 계층 구조 다 확인)SET @var = 'M0';
WITH RECURSIVE t3 (id, m_name, depth, parent, m_order) AS
(
SELECT t1.id, t1.m_name, t1.depth, t1.parent, t1.m_order
FROM practice.recursion_test t1
WHERE t1.parent = @var
UNION ALL
SELECT t2.id, t2.m_name, t2.depth, t2.parent, t2.m_order
FROM practice.recursion_test t2
INNER JOIN t3 ON t2.parent = t3.id
)
SELECT * FROM t3
ORDER BY t3.id, t3.`m_order`;결과는?
| id | m_name | depth | parent | m_oder |
|---|---|---|---|---|
| M00 | 세리에A | 2 | M0 | 0 |
| M01 | K-LEAGUE | 2 | M0 | 1 |
| M02 | 프리메라리그 | 2 | M0 | 2 |