MYSQL实现Oracle的Start with…Connect By递归树查询

因项目迁移,使用的数据库也需要从Oracle迁移到MySQL 其中有个功能使用到了Oracle的Start with…Connect By递归树查询,而MySQL中没有此函数,但可以通过自定义函数的方式来解决这个问题

创建表

  1. create table treeList(
  2. id varchar(10), -- 节点ID
  3. name varchar(10), -- 节点名称
  4. pId varchar(10) -- ID
  5. )

插入测试数据

  1. insert into treeList values(1,'中国',null);
  2. insert into treeList values(2,'北京',1);
  3. insert into treeList values(3,'上海',1);
  4. insert into treeList values(4,'深圳',1);
  5. insert into treeList values(5,'海淀',2);
  6. insert into treeList values(6,'朝阳',2);
  7. insert into treeList values(7,'昌平',2);
  8. insert into treeList values(8,'丰台',2);

创建函数getChildList

  1. CREATE FUNCTION getChildList (rootId VARCHAR(100)) -- rootId为要查询的节点
  2. RETURNS VARCHAR(1000)
  3. BEGIN
  4. DECLARE pTemp VARCHAR(1000);
  5. DECLARE cTemp VARCHAR(1000); -- 定义两个临时变量
  6. SET pTemp = '';
  7. SET cTemp = rootId;
  8. WHILE cTemp is not null DO
  9. if (pTemp = '') then
  10. SET pTemp = cTemp;
  11. elseif(pTemp <> '') then
  12. SET pTemp = concat(pTemp,',',cTemp); -- 所有节点连接成字符串
  13. end if;
  14. SELECT group_concat(id) INTO cTemp FROM treeList
  15. WHERE FIND_IN_SET(pId,cTemp)>0;
  16. END WHILE;
  17. RETURN pTemp;
  18. END

执行方法 查询节点为“2”下的所有节点

  1. select getChildList('2') as ids

运行结果

 

 

博文转载自麦田技术博客