Mysql中的递归层次查询(父节点下的所有节点)
在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!! 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。本人此文章的环境为mysql5.0,现在高版本建立函数出错请参考 解决建立函数报错问.
在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);
根据传入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));
即可出现结果
更多推荐
所有评论(0)