美文网首页我爱编程
MYSQL实现Oracle的Start with…Connect

MYSQL实现Oracle的Start with…Connect

作者: 曼巴童鞋 | 来源:发表于2018-01-05 16:57 被阅读0次

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

    创建表

    create table treeList(
       id varchar(10), -- 节点ID
       name varchar(10), -- 节点名称
       pId varchar(10) -- 父ID
    )
    

    插入测试数据

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

    创建函数getChildList

    CREATE FUNCTION getChildList (rootId VARCHAR(100)) -- rootId为要查询的节点
    RETURNS VARCHAR(1000)
    BEGIN
        DECLARE pTemp VARCHAR(1000);  
        DECLARE cTemp VARCHAR(1000); -- 定义两个临时变量
           
        SET pTemp = '';  
        SET cTemp = rootId;
           
        WHILE cTemp is not null DO  
           if (pTemp = '') then
             SET pTemp = cTemp;
             elseif(pTemp <> '') then
             SET pTemp = concat(pTemp,',',cTemp); -- 所有节点连接成字符串
             end if;
             SELECT group_concat(id) INTO cTemp FROM treeList   
             WHERE FIND_IN_SET(pId,cTemp)>0; 
         END WHILE;  
         RETURN pTemp;  
    END
    

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

    select getChildList('2') as ids
    

    运行结果

    博文转载自麦田技术博客

    相关文章

      网友评论

        本文标题:MYSQL实现Oracle的Start with…Connect

        本文链接:https://www.haomeiwen.com/subject/toesnxtx.html