sql遞迴查詢父節點的例子

2021-08-09 06:06:32 字數 1874 閱讀 8035

由於專案要分地區,而且是自己定義的 ,所有建立乙個分組表

create table `group_info` (

`group_id` bigint(10) not null auto_increment comment '分組id',

`content` varchar(2000) default null comment '分組說明',

`f_group_id` bigint(10) default null comment '上級分組id',

`group_name` varchar(255) default null comment ' 分組名稱',

`field_id` bigint(10) not null comment '域的id',

`gmt_create` datetime default null comment '建立時間',

`gmt_mod` datetime default null comment '修改時間',

primary key (`group_id`)

) engine=innodb default charset=gbk;

這個就是設計的表結構可以根據上級找下級,剛開始有乙個分組全名稱 group_full_name 比如這種「重慶市_九龍坡區」的顯示字段,後來覺得它沒有必要存在,而且用**遞迴,很難維護,更改了上級,下級也要跟著變,覺得太繁瑣了。

所有覺定寫乙個 sql函式:

drop function if exists getparentlist;

create function getparentlist (rootid varchar(1000))

returns varchar(1000)

begin

declare fid varchar(1000) default '';

declare str varchar(1000) default rootid;

declare groupname varchar(1000) default '';

declare fullname varchar(1000) default '';

while rootid is not null  do

set fid =(select f_group_id from group_info where group_id = rootid);

set groupname=(select group_name from group_info where group_id = rootid);

if fid is not null then

set fullname = concat(groupname, '_', fullname);

set rootid = fid;

else

set rootid = fid;

end if;

end while;

set fullname= trim('_' from fullname);

return fullname;

end;

這樣只需要傳乙個下級的groupid也就是rootid就可以把group_full_name完全展示出來,這個用起來很方便,

select

g.group_id,

g.content,

g.group_name,

g.f_group_id,

g.gmt_create,

getparentlist(g.group_id) as group_full_name

from

group_info g

這樣分組全名稱就直接展示出來了,如果有人用到了flyway來做資料庫遷移,function不能被遷移的 猜想是框架沒有做這個處理,  記錄工作中遇到的問題,方便自己查詢。

父節點遞迴查詢和子節點遞迴查詢函式

由於在專案中用到了向上查詢父節點的遞迴查詢和向下查詢子節點查詢的遞迴查詢,由於在實現過程中,寫遞迴查詢的sql函式 花費了較長的時間,所以在此總結一下,兩種遞迴查詢的函式的實現寫法 向下查詢子節點的遞迴查詢 先展示表結構 根據區域查詢對應的下級區域資訊,其中parentid為zoneid對應的下級區...

根據子節點遞迴查詢所有父節點

有個需求,需要根據給定的子節點向上遞迴查詢所有父節點,網上查詢了一些,但是都不是很滿意,有的是需要用到全域性變數定義儲存列表,但是會有併發問題,然後自己手寫乙個 test void contextloads1 public listgetpid listidlist,integer pid,list...

用遞迴演算法查詢父節點下的所有葉子節點

父節點 葉子節點 子節點一 葉子節點 葉子節點 子節點二 子節點三 葉子節點 葉子節點 如何得到父節點 採用遞迴演算法,碰到葉子節點就加到列表裡,不是葉子節點就對其進行迴圈再遞迴遍歷 向旗新增 實現將得到的目錄的所有子目錄和目錄本身變成id的list param 目錄id return 目錄與其所有...