如何用mysql存一棵樹 如何在資料庫中儲存一棵樹

2021-10-17 19:22:11 字數 1409 閱讀 6885

方法一要儲存於資料庫中,最簡單直接的方法,就是儲存每個元素的父節點id。

暫且把這種方法命名依賴父節點法,因此表結構設計如下:

儲存的資料如下格式:

這種結構下,如果查詢某乙個節點的直接子節點,十分容易,比如要查詢d節點的子節點。

select * from tree1 where parentid=4

如果要插入某個節點,比如在d節點下,再次插入乙個m節點。

只需要如下sql:

insert into tree1 (value,parentid) values('m',4);

這種結構在查詢某個節點的所有子節點,就稍顯複雜,無論是select還是delete都可能涉及到獲取所有子節點的問題。比如要刪除乙個節點並且該節點的子節點也要全部刪除,那麼首先要獲得所有子節點的id,因為子節點並不只是直接子節點,還可能包含子節點的子節點。比如刪除d節點及其子節點,必須先查出d節點下的所有子節點,然後再做刪除,sql如下:

select nodeid from tree1 where parentid=4 --返回8,9

select nodeid from tree1 where parentid in (8,9) --返回10,11,12

select nodeid from tree1 where parentid in (10,11,12) --返回空

delete from tree1 where nodeid in (4,8,9,10,11,12)

如果是只刪除d節點,對於其它節點不做刪除而是做提公升,那麼必須先修改子節點的parentid,然後才能刪除d節點。

正如上面演示的,對於這種依賴父節點法,最大的缺點就是無法直接獲得某個節點的所有子節點。因此如果要select所有的子節點,需要繁瑣的步驟,這不利於做聚合操作。

對於某些資料庫產品,支援遞迴查詢語句的,比如微軟的sql server,可以使用cte技術實現遞迴查詢。比如,要查詢d節點的所有子節點。只需要如下語句:

with tmp as(

select * from tree1 where nodeid = 4

union all

select a.* from tree1 as a,tmp as b where a.parentid = b. nodeid

select * from tmp

但是對於那些不支援遞迴查詢的資料庫來說,實現起來就比較複雜了。

31/3123>

如何用mysql存一棵樹 如何在資料庫中儲存一棵樹

方法一要儲存於資料庫中,最簡單直接的方法,就是儲存每個元素的父節點id。暫且把這種方法命名依賴父節點法,因此表結構設計如下 儲存的資料如下格式 這種結構下,如果查詢某乙個節點的直接子節點,十分容易,比如要查詢d節點的子節點。如果要插入某個節點,比如在d節點下,再次插入乙個m節點。只需要如下sql 這...

如何判斷一棵樹是不是另一棵樹的子樹

package suanfatest class treenode treenode int value treenode int value,treenode leftchild,treenode rightchild public int getvalue public void setvalu...

一棵樹是否為另一棵樹的子結構

輸入兩顆二叉樹a,b,判斷b是不是a的子結構。問題描述 給定兩個二叉樹的根節點,判斷第二樹是否是第乙個樹的子樹,如果是返回1,否則返回0.拿第二個樹的每個節點去和第乙個樹做匹配,如果某個節點匹配成功,就接著往下匹配,否則重新從第二個樹的的根節點開始。注意區別 測試用例 樹1 42 6 1 3 5 7...