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

2021-09-03 01:42:22 字數 3386 閱讀 4318

在mysql中如何完成節點下的所有節點或節點上的所有父節點的查詢?

在oracle中我們知道有乙個hierarchical queries可以通過connect by來查詢,但是,在mysql中還沒有對應的函式!!!

下面是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;

插入幾條資料

-- ---------------------------- 

-- 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');

function:根據傳入id查詢所有父節點的id把下面的語句直接貼上進命令列執行即可(注意修改傳入的引數,預設rootid,表明預設treenodes)

delimiter // 

create function `getparlst`(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));
結果:

idnodename

pid8h0

9i812

l915o

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

delimiter // 

create function `getparlst`(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));
結果:

idnodename

pid7

g

親測可用,還很方便!

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

描述 最近遇到了乙個問題,在mysql中如何完成節點下的所有節點或節點上的所有父節點的查詢?在oracle中我們知道有乙個hierarchical queries可以通過connect by來查詢,但是,在mysql中還沒有對應的函式 下面給出乙個function來完成的方法 下面是sql指令碼,想...

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