關於乙個樹形結構對於資料庫的查詢

2021-05-25 02:33:55 字數 1537 閱讀 7401

通常我們在做頁面樹查詢資料庫的時候,通過對一張表的重複遞迴,可以查詢出表中的所有分類,這種方法確實可以遞迴出表中的所有節點分類,但是不斷的遞迴會造成不必要的一些問題,這裡有乙個比較經典的關於對資料庫中,樹狀結構的查詢,如下:表的建立:

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...