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);  

 

posted @ 2016-08-19 18:38  零度的冰  阅读(460)  评论(0编辑  收藏  举报