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 |