MySQL如何實現(xiàn)樹狀結(jié)構(gòu)圖?下面是具體的實現(xiàn)過程。
首先,我們需要一個數(shù)據(jù)表來存儲樹的每個節(jié)點。表結(jié)構(gòu)如下:
CREATE TABLE `tree` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(11) unsigned NOT NULL DEFAULT '0', `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) );
其中,parent_id
字段表示當前節(jié)點的父節(jié)點ID,根節(jié)點的父節(jié)點ID默認為0。
接下來,我們需要插入一些測試數(shù)據(jù):
INSERT INTO `tree` (`name`, `parent_id`) VALUES ('根節(jié)點', 0), ('節(jié)點1', 1), ('節(jié)點2', 1), ('子節(jié)點1', 2), ('子節(jié)點2', 2), ('節(jié)點3', 1);
現(xiàn)在,我們可以通過如下的SQL語句來獲取整個樹的結(jié)構(gòu):
SELECT T1.id, T1.name, T1.parent_id, CONCAT( REPEAT(' ', LEVEL - 1), -- 全角空格 IF(LEVEL = 1, '└─', '├─'), T1.name ) AS tree_name FROM tree AS T1 JOIN ( SELECT id, @level := @level + 1 AS LEVEL FROM tree JOIN (SELECT @level := 0) AS INIT ) AS T2 ON T1.id = T2.id ORDER BY tree_name;
該SQL語句使用了MySQL的REPEAT
函數(shù)和級聯(lián)查詢,通過拼接空格和分隔符來實現(xiàn)樹狀結(jié)構(gòu)圖的效果:
id name parent_id tree_name 1 根節(jié)點 0 └─根節(jié)點 2 節(jié)點1 1 ├─節(jié)點1 3 節(jié)點2 1 ├─節(jié)點2 4 子節(jié)點1 2 │ └─子節(jié)點1 5 子節(jié)點2 2 │ └─子節(jié)點2 6 節(jié)點3 1 └─節(jié)點3
通過上述SQL語句的轉(zhuǎn)化,我們得到了非常生動的樹狀結(jié)構(gòu)圖。除此之外,當數(shù)據(jù)表中新增或刪除節(jié)點時,該SQL語句也可以自動更新樹狀結(jié)構(gòu)圖,十分方便。