写这个的初衷在于让自己对方法的应用更加深刻,废话不多进入今天的主题.Mysql单表递归查询(文章主要借鉴于网络).
首先建表nodelist.
CREATE TABLE nodelist(
id INT PRIMARY KEY, //本节点ID。
nodename VARCHAR(20), //节点名称,为方便辨别而已。
pid INT //父节点。
);
接着插入表数据.
Insert INTO nodelist VALUES(1,'A',null); //id为父节点,即根节点。
Insert INTO nodelist VALUES(2,'B',1);
Insert INTO nodelist VALUES(3,'C',1);
Insert INTO nodelist VALUES(4,'D',2);
Insert INTO nodelist VALUES(5,'E',3);
Insert INTO nodelist VALUES(6,'F',3);
Insert INTO nodelist VALUES(7,'G',5);
Insert INTO nodelist VALUES(8,'H',7);
Insert INTO nodelist VALUES(9,'I',8);
Insert INTO nodelist VALUES(10,'J',8);
接着创建函数方法getChildList():
CREATE FUNCTION `getChildList`(rootId INT) //rootId为你要查询的节点。
RETURNS VARCHAR(1000)
BEGIN
DECLARE pTemp VARCHAR(1000);
DECLARE cTemp VARCHAR(1000); //两个临时变量
SET pTemp = '$';
SET cTemp =cast(rootId as CHAR); //把rootId强制转换为字符。
WHILE cTemp is not null DO
SET pTemp = concat(pTemp,',',cTemp); //把所有节点连接成字符串。
SELECT group_concat(id) INTO cTemp FROM nodelist
WHERE FIND_IN_SET(pid,cTemp)>0;
END WHILE;
RETURN pTemp;
END
最后执行函数方法就会出现结果啦
getChildList(1):
这是一个下级查询,如果需要要上级查询转换一下父子id的位置就可以了,代码如下.
CREATE FUNCTION `getFatherList`(rootId INT) //rootId为你要查询的节点。
RETURNS VARCHAR(1000)
BEGIN
DECLARE pTemp VARCHAR(1000);
DECLARE cTemp VARCHAR(1000); //两个临时变量
SET pTemp = '$';
SET cTemp =cast(rootId as CHAR); //把rootId强制转换为字符。
WHILE cTemp is not null DO
SET pTemp = concat(pTemp,',',cTemp); //把所有节点连接成字符串。
SELECT group_concat(pid) INTO cTemp FROM nodelist
WHERE FIND_IN_SET(id,cTemp)>0;
END WHILE;
RETURN pTemp;
END
希望能对大家有帮助.