用資料庫實現樹型結構

2021-05-22 14:19:58 字數 2463 閱讀 9199

做**的時候有時需要實現乙個樹形列表,類似目錄那樣的。最好的建立方法就是採用指向父節點的指標的結構建立表。

表的結構如下:(表名為xx)

字段

型別

null

預設

注釋

cidint(11) 否

主鍵 pid

int(11) 否

0 父類別的cid,=0表示該項為頂層類別。

name

varchar(64) 否

類別名。

查詢時只需要乙個sql語句就能查詢出所有節點:

select distinct c2.cid, c2.pid, c2.name

from xx c1, xx c2

where c2.pid=c1.cid or c2.pid=0;

這樣查詢出來的結果就是乙個鏈式儲存的,指向父節點指標的樹了,現在我們要做的就是把這棵樹變成普通的樹,這樣我們就可以方便的輸出了。

下面是用php實現的轉換**:

查詢出來的結果存在 $this->data 裡,格式如下:

array

([0] => array ( [cid] => 1, [pid] => 0, [name] => 運動 )

[1] => array ( [cid] => 2, [pid] => 0, [name] => 遊戲 )

[2] => array ( [cid] => 3, [pid] => 0, [name] => 程式 )

[3] => array ( [cid] => 4, [pid] => 1, [name] => 足球 )

[4] => array ( [cid] => 5, [pid] => 1, [name] => 籃球 )

[5] => array ( [cid] => 6 [pid] => 1 [name] => 羽毛球 )

[6] => array ( [cid] => 7 [pid] => 2 [name] => 即時戰略類 )

[7] => array ( [cid] => 8 [pid] => 2 [name] => rpg類 )

[8] => array ( [cid] => 9 [pid] => 7 [name] => 紅警 )

[9] => array ( [cid] => 10 [pid] => 7 [name] => 星際 )

[10] => array ( [cid] => 11 [pid] => 7 [name] => 魔獸 )

[11] => array ( [cid] => 12 [pid] => 8 [name] => 仙劍 )

)

<?php

// 測試輸出,把結果輸出成巢狀的/n";

}echo "/n";}}

/*** 在當前節點處遞迴建立樹。

** @param $tree array, 當前節點。

* @param $pa   array, 祖先節點表,老的排前面。

* @param $i    int, $pa的當前位置。

* @param $n    int, 要插入的節點。

** @return void

*/function create_tree(& $tree, $pa, $i, $n)

// 遞迴到下一級祖先處

$next=$pa[$i];

create_tree($tree[$next], $pa, $i+1, $n);

}$plist=array();

$list[0]=array();

// 重排資料庫查詢結果,使得$data的下標即為$cid。

// 並生成樹,存入$list中($list[0])為數的根節點。

foreach ($this->data as $v)

preorder($list, $data);

?>

呼叫完create_tree以後,$list 裡是這樣的:

array

([0] => array

([1] => array

([4] => array ( )

[5] => array ( )

[6] => array ( )

)[2] => array

([7] => array

([9] => array ( )

[10] => array ( )

[11] => array ( )

)[8] => array

([12] => array ( )))

[3] => array ( )

))

輸出結果:(後面數字是它的cid)

遊戲(2) »

rpg類(8) »

程式(3) »

沒怎麼整理,等有時間了再好好整理一下。

資料庫 樹型結構 TTreeView篇

1.首先看一下我的資料庫結構 id int group name int parent id int 不用解釋,相信大家一看就明白。2.delphi中新建乙個datemodel,命名為dm,和乙個窗體frmmain 在dm中放入tadoconnection,和乙個tadodataset,並連線上資料...

基於資料庫的樹型結構方案(儲存過程實現)

樹型結構是遞迴演算法的經典例項 只怪非cs的我沒有紮實的資料結構功底,鼓搗了兩個半天 p 有個新聞分類表category,如圖,現在想取出分類資料後以樹型展開並在下拉框中顯示出來。本來的方案是取出資料後在中間層對datatable排序,格式字串等放在一起操作的,後來感覺中間層負擔太重,所以把排序放到...

樹型控制項實現資料庫的訪問

本人意圖將資料庫中的內容加入樹型控制項中,通過建立資料庫,再與樹型控制項相連,實現資料庫的訪問。查詢結構清晰明了,操作方便。現將其方法闡述如下 1 建資料庫 建立access資料庫,資料庫結構和內容見程式包access檔案。2 建立單文件不基於資料庫支援的應用程式工程,檢視類繼承於cformview...