mysql递归查询及节点层级_Mysql中的递归层次查询(父节点下的所有节点)

在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!! 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。本人此文章的环境为mysql5.0,现在高版本建立函数出错请参考  解决建立函数报错问题

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

根据传入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));

结果:

cc2a585449b2b258f23ed754c7b89fa6.png 

根据传入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));

即可出现结果


版权声明:本文为weixin_36029647原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。