通常我們在做頁面樹查詢資料庫的時候,通過對一張表的重複遞迴,可以查詢出表中的所有分類,這種方法確實可以遞迴出表中的所有節點分類,但是不斷的遞迴會造成不必要的一些問題,這裡有乙個比較經典的關於對資料庫中,樹狀結構的查詢,如下:表的建立:
create table category
(id varchar(40) primary key,
name varchar(100),
lft int, --
代表節點的左數值
rgt int --
代表節點的右數值
)插入資料如下:
insert into category values('1','
商品',1,18);
insert into category values('2','
平板電視',2,7);
insert into category values('3','
冰箱',8,11);
insert into category values('4','
筆記本',12,17);
insert into category values('5','
長虹',3,4);
insert into category values('6','
索尼',5,6);
insert into category values('7','
西門子',9,10);
insert into category values('8','thinkpad',13,14);
insert into category values('9','dell',15,16);
首先我們使用表的自連線查詢,將這張表看做兩張表:
select * from category parent, category child;
我們發現,在我們所設計的樹中,孩子節點的左數值永遠大於父親節點的左數值,孩子節點的右數值永遠小於父親節點的右數值,通過如下語句,我們可以得到父親的所有孩子
select * from category parent, category child where child.lft>parent.lft and child.rgt
我們通過對孩子們進行歸類,就可以根據乙個孩子歸類的次數來獲取這個孩子位於樹的那一層,例如,乙個孩子歸類兩次,說明他有兩個父親,就可以得到這個孩子的層數
depth
select child.name,count(child.name) depthfrom category parent, category child where child.lft>parent.lft and child.rgt
最後我們通過左數值進行排序,就可以實現頁面效果了:
select child.name,count(child.name) depthfrom category parent, category child where child.lft>parent.lft and child.rgt
這種結構在查詢的過程中,並沒有使用遞迴,並且也能夠高效的查詢出所有的節點分支,在用來做樹的時候,是很不錯的選擇。
資料庫儲存樹形結構的資料
最近接觸樹形結構資料非常的多,幾乎超過了過去8年多,開發所有系統的總和.本來嘛,一般的遞迴就可以解決了,可是這個系統中總是需要頻繁的訪問樹結點,及父結點,子結點,動不動就要遞迴,且樹的使用非常之多,做的多了搞的人都要嘔吐了,下面在網上找到幾篇比較有用的資料,記錄彙總一下.首先,資料庫不一定要用傳統的...
關於資料庫查詢的乙個問題
今天碰到了乙個資料庫關聯查詢的問題,問題上是這樣的 客戶需要將每個部門下所有的員工學習課程數按降序排列,本來應該是乙個很簡單的問題,但是問題出現了,就是部門是分多級別的,而且學習課程統計裡關聯的只有員工的id,於是我先把對應的幾個大部門從部門表裡抽出來,然後學習課程裡的員工在部門表裡迴圈查詢,結果是...
關於樹形結構的乙個簡單又適用模型
在以前的web專案中使用選單結構是以樹形結構構件,其中jquery中treeviewer已經ext中樹形結構等。無論哪種樹形結構都一樣的。樹形結構的乙個一般的節點必須有名稱以及乙個可能的父類節點。乙個父類節點有乙個名稱,可能的父類節點。可能的一系列子節點。於是乙個點檢的模型出來來。子節點模型 cla...