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