MySQL 查詢 樹結構

2021-09-29 09:14:47 字數 3209 閱讀 8560

關於樹結構

此類結構的資料,通常需要表結構中含有id 、parentid等自關聯字段,有時為了提高查詢效率還可增加更多冗餘字段,如index,index的值為所有父級目錄的id字串集合。

關於樹結構資料的組裝,常見的寫法是在程式中通過遞迴的方式去構建出一顆完整的樹,單純通過sql的方式其實並不常用,下面分別給出兩種方式的例子。

mysql自定義函式的方式

什麼是mysql自定義函式:聚合函式,日期函式之類的都是mysql的函式,此處我們定義的函式可同他們一樣使用,不過只能在定義的資料庫中使用,自定義函式和儲存過程類似,不同的是,函式只會返回乙個值,不允許返回乙個結果集。

2.1 建立測試資料

create table `tree`  (

`id` bigint(11

) not null,

`pid` bigint(11

) null default null,

`name` varchar

(255

) character set utf8 collate utf8_general_ci null default null,

primary key (`id`) using btree

) engine = innodb character set = utf8 collate = utf8_general_ci row_format = dynamic;

insert into `tree` values (1,

0,'中國');

insert into `tree` values (2,

1,'四川省');

insert into `tree` values (3,

2,'成都市');

insert into `tree` values (4,

3,'武侯區');

insert into `tree` values (5,

4,'紅牌樓');

insert into `tree` values (6,

1,'廣東省');

insert into `tree` values (7,

1,'浙江省');

insert into `tree` values (8,

6,'廣州市'

);

2.1 獲取 某節點下所有子節點

create function `get_child_node`(rootid varchar

(100

))

returns varchar

(2000

) begin

declare str varchar

(2000

);

declare cid varchar

(100

);

set str =

'$';

set cid = rootid;

while cid is not null do

set str =

concat

(str,

',', cid)

;

select group_concat

(id) into cid from tree where find_in_set

(pid, cid)

;

end while;

return str;

end

呼叫自定義函式

2.2 獲取 某節點的所有父節點

create function `get_parent_node`(rootid varchar

(100

))

returns varchar

(1000

)

begin

declare fid varchar

(100

)default

'';

declare str varchar

(1000

)default rootid;

while rootid is not null do

set fid =

(select pid from tree where id = rootid)

;

if fid is not null then

set str =

concat

(str,

',', fid)

;

set rootid = fid;

else

set rootid = fid;

end if;

end while;

return str;

end

呼叫自定義函式

3. oracle資料庫的方式

只需要使用start with connect by prior語句即可完成遞迴的樹查詢,詳情請自己查閱相關資料。

程式**遞迴的方式構建樹(此方式在專案中最常用,推薦)

這裡我就不給出完整**了,遞迴的方式很簡單,就是先查出所有樹節點,然後通過乙個treenode類中的add方法遞迴把所有子節點給加進來。核心**如下:

public

class

treenodedto

else

if(node.parentid.

equals

(this

.id)

)else}}

}

參考文章:

mysql查詢樹結構 定義函式

修改一下函式,然後就可以使用了。查詢樹結構函式 mysql可用 drop function if exists queryupmsmenutree 函式名 create function queryupmsmenutree param id varchar 32 傳入引數 returns varch...

Oracle 樹結構查詢

同事寫的樹結構查詢,記錄一下 表結構很簡單 就兩列 rangid number rangname varchar2 主要根據rangid數值來表示層級關係 select t1.rangid,t1.rangname,decode select count from test t2 where t2.r...

Oracle樹結構查詢

oracle樹結構查詢 start with connect by用法簡介 oracle是乙個關聯式資料庫管理系統,它用表的形式組織資料,在某些表中的資料還呈現出 樹型結構的聯絡。例如,我們現在討論雇員資訊表emp,其中含有雇員編號 empno 和 經理 mgr 兩例,通過這兩列反映出來的就是雇員之...