Mysql中的遞迴層次查詢(父子查詢)

2021-12-29 19:52:54 字數 3173 閱讀 7738

描述:最近遇到了乙個問題,在mysql中如何完成節點下的所有節點或節點上的所有父節點的查詢? 在oracle中我們知道有乙個hierarchical queries可以通過connect by來查詢,但是,在mysql中還沒有對應的函式!!! 下面給出乙個function來完成的方法 下面是sql指令碼,想要執行的直接賦值貼上進資料庫即可。

好記性不如爛筆頭

下面給出乙個function來完成的方法

下面是sql指令碼,想要執行的直接賦值貼上進資料庫即可。

建立表treenodes(可以根據需要進行更改)

– table structure for treenodes

drop table if exists treenodes;

create table treenodes (

id int(11) not null,

nodename varchar(20) default null,

pid int(11) default null,

primary key (id)

) engine=innodb default charset=latin1;

– table structure for treenodes

插入幾條資料

– records of treenodes

insert into treenodes values (『1』, 『a』, 『0』);

insert into treenodes values (『2』, 『b』, 『1』);

insert into treenodes values (『3』, 『c』, 『1』);

insert into treenodes values (『4』, 『d』, 『2』);

insert into treenodes values (『5』, 『e』, 『2』);

insert into treenodes values (『6』, 『f』, 『3』);

insert into treenodes values (『7』, 『g』, 『6』);

insert into treenodes values (『8』, 『h』, 『0』);

insert into treenodes values (『9』, 『i』, 『8』);

insert into treenodes values (『10』, 『j』, 『8』);

insert into treenodes values (『11』, 『k』, 『8』);

insert into treenodes values (『12』, 『l』, 『9』);

insert into treenodes values (『13』, 『m』, 『9』);

insert into treenodes values (『14』, 『n』, 『12』);

insert into treenodes values (『15』, 『o』, 『12』);

insert into treenodes values (『16』, 『p』, 『15』);

insert into treenodes values (『17』, 『q』, 『15』);

把下面的語句直接貼上進命令列執行即可(注意修改傳入的引數,預設rootid,表明預設treenodes)

根據傳入id查詢所有父節點的id

delimiter //

create function `getparlist`(rootid int)

returns varchar(1000)

begin

declare stemp varchar(1000);

declare stemppar varchar(1000);

set stemp = '';

set stemppar =rootid;

#迴圈遞迴

while stemppar is not null do

#判斷是否是第乙個,不加的話第乙個會為空

if stemp != '' then

set stemp = concat(stemp,',',stemppar);

else

set stemp = stemppar;

end if;

set stemp = concat(stemp,',',stemppar);

select group_concat(pid) into stemppar from treenodes where pid<>id and find_in_set(id,stemppar)>0;

end while;

return stemp;

end//

執行命令

select * from treenodes where find_in_set(id,getparlist(15));

結果:

根據傳入id查詢所有子節點的id

delimiter //

create function `getchildlist`(rootid int)

returns varchar(1000)

begin

declare stemp varchar(1000);

declare stempchd varchar(1000);

set stemp = '$';

set stempchd =cast(rootid as char);

while stempchd is not null do

set stemp = concat(stemp,',',stempchd);

select group_concat(id) into stempchd from treenodes where find_in_set(pid,stempchd)>0;

end while;

return stemp;

end//

執行命令

select * from treenodes where find_in_set(id,getchildlist(7));

結果:

Mysql中的遞迴層次查詢(父子查詢)

在mysql中如何完成節點下的所有節點或節點上的所有父節點的查詢?在oracle中我們知道有乙個hierarchical queries可以通過connect by來查詢,但是,在mysql中還沒有對應的函式 下面是sql指令碼,想要執行的直接賦值貼上進資料庫即可。建立表treenodes 可以根據...

MySQL遞迴查詢父子節點

create table folder id bigint 20 not null,parent id bigint 20 default null,primary key id 建立函式 create function getparlist rootid bigint returns varcha...

mysql實現父子遞迴查詢sql

在很多業務場景中,我們需要從資料庫查詢一些樹狀結構的資料,多半以id,pid的形式儲存記錄。在oracle中,能夠通過語法輕鬆實現父子級間的遞迴查詢,無論到父,子,孫,曾孫等多少級,都能查出來。但是在mysql中,就沒有像oracle中那樣有現成的語法直接呼叫了。設表test有以下字段 id,nam...