• START WITH CONNECT BY PRIOR 链表查询


    使用场景:排序

    设计思路,id为主键,index为顺序,index存前一个节点的id,当然,按照这个思路可以实现双向链表的(preindex存前一个节点,nextindex存下一个节点)

    这样的话排序只需交换需要排序的index即可,如:

    A(id:1 index:0) B(id:2 index:1)C(id:3 index:2)D(id:4 index:3)

    四个节点如果想将D排序到B前面,也就是A-D-B-C,这样只需要将D的index更换成B的index1,B节点的更换成D的id即可;

    以上是排序的思路;那如何获取顺序的列表呢?借助START WITH CONNECT BY PRIOR 

    Oracle   SQL如下:

    select A.id, A.index
    from A
    start with A.index = 0
    connect by prior id = index

    mysql实现递归查询就不能使用这种了,需要自定义函数 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(index,cTemp)>0;
    // FIND_IN_SET(str,strlist)的方法网上大把不解释。
    END WHILE; 
    RETURN pTemp; 
    END

    使用 SELECT getChildList(1);  

  • 相关阅读:
    C++中pair的用法
    DFS例题:力扣200:岛屿数量
    DFS例题:力扣695:岛屿的最大面积
    DFS深度优先遍历
    java AQS源码分析
    spring实现事务原理
    java常见并发面试题目+示例代码
    java并发锁
    ThreadPoolExecutor
    线程通信
  • 原文地址:https://www.cnblogs.com/bing521meng/p/5788718.html
Copyright © 2020-2023  润新知