使用MYSQL实现Oracle的Start with...Connect By递归树查询
2018-02-06 12:49
686 查看
创建表nodelist:
CREATE TABLE nodelist(
id INT PRIMARY KEY, //本节点ID。
nodename VARCHAR(20), //节点名称,为方便辨别而已。
pid INT //父节点。
);
插入表测试数据:
Insert INTO nodelist VALUES(1,'A',null); //父节点为,即根节点。
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;
// FIND_IN_SET(str,strlist)的方法网上大把不解释。
END WHILE;
RETURN pTemp;
END
执行方法getChildList(1):
SELECT getChildList(1);
运行结果如下图:
查询节点为“3”下的所有节点:
SELECT * FROM nodelist WHERE FIND_IN_SET(id, getChildList(3));
运行结果如下图:
CREATE TABLE nodelist(
id INT PRIMARY KEY, //本节点ID。
nodename VARCHAR(20), //节点名称,为方便辨别而已。
pid INT //父节点。
);
插入表测试数据:
Insert INTO nodelist VALUES(1,'A',null); //父节点为,即根节点。
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;
// FIND_IN_SET(str,strlist)的方法网上大把不解释。
END WHILE;
RETURN pTemp;
END
执行方法getChildList(1):
SELECT getChildList(1);
运行结果如下图:
查询节点为“3”下的所有节点:
SELECT * FROM nodelist WHERE FIND_IN_SET(id, getChildList(3));
运行结果如下图:
相关文章推荐
- 使用MYSQL实现Oracle的Start with...Connect By递归树查询
- 使用MYSQL实现Oracle的Start with...Connect By递归树查询
- 使用MYSQL实现Oracle的Start with...Connect By递归树查询
- MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询
- oracle转mysql,start with树结构用Java实现
- Oracle实现树查询:select ... start with ... connect by prior
- MySQL实现类似Oracle中start with功能
- oracle 使用 START WITH…CONNECT BY PRIOR 实现递归查询
- Oracle中使用Start With connect by prior实现树功能
- oracle中用start with...connect by prior子句实现递归查询[例子不错]
- sqlserver下用函数实现 oracle 的树查询( start with connect by ) 功能
- oracle函数dense_rank(),row_number(),connect_by_root(),start with connect by 用mysql如何实现
- 用Mysql怎样实现Oracle中的SYS_CONNECT_BY_PATH函数和START WITH ...CONNECT BY PRIOR方法
- oracle start with实现递归查询实例
- MySQL实现类似Oracle中start with功能
- mysql的逆袭:如何做oracle的start with connect by prior递归层次查询
- Oracle 树查询 性能优化纪实(start with, connect by)
- Oracle--connect by...start with...的使用(转)
- Oracle树结构查询 start with ... connect by用法简介
- 使用oracle的start with... connect by prior根据子节点,找到从子节点到根目录所有路径