mysql递归查询方法|mysql递归查询遇到的坑,教你们解决办法

1.前言

大家在用mysql递归查询的时候,肯定或多或少的会碰到一些问题,像小编就遇到了天大的坑(如下图),于是自己踩了坑,我得想办法把它铺一铺吖,避免大家也同时遇到这样的问题。让技术人能够快速的解决问题。

遇到问题如图:

相信很多人都用不惯mysql,小编也是,oracle的递归查询很简单。就一句sql就可以搞定,还有不清楚或者突然忘记需要温习的小伙伴们,大家可以看小编发的以前的关于oracle递归查询的方法,戳这里:【oracle递归查询方法介绍】


2.踩坑介绍

mysql递归查询,不会吖,大家可以网上搜索递归查询的方法,这一查很多,

比如:https://www.cnblogs.com/xiaoxi/p/5942805.html 或者:https://blog.csdn.net/jian_c/article/details/79854491等等,我就不一一列举啦,但是他们可能也是转载其他人的,其中遇到问题,他们并没有提前向大家说明或者他们自己也没有试过,小编就拿其中的一个方法试了一下,就遇到了如开头所说的一堆问题,所以大家在使用mysql递归方法之前一定要把这篇文章看完,因为你不看的话,等一下你一执行递归查询语句,一试一个错

3.埋坑教程

我就以这篇文章为例了:https://blog.csdn.net/jian_c/article/details/79854491

①递归子节点

咱们先看递归所有的子节点,首先必须得创建辅助函数getChildList(),如下代码


CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1000) 
 
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);
 
    SET sTemp = '$';
    SET sTempChd =cast(rootId as CHAR);
 
    WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(id) INTO sTempChd FROM  treeNodes where FIND_IN_SET(pid,sTempChd)>0;
    END WHILE;
    RETURN sTemp; 
END

上面这个辅助函数,你不要盲目的全部复制过去,然后一执行就肯定会报错的,一定要注意里面的字段和你创建的表的对应关系,这点也就是和oracle区别最大的地方

看我下面的截图标记的序号分别要注意的要点,

1:你创建的表的主键id,

2:你创建的表名,

3:你创建的表的表示上级的字段,

4:这里可以改可以不改,因为按照mysql这样的情况,如果你的数据库可能将来有多张表会用到递归查询的话,这里最好换个名字,比如getchildListTablename,tablename可以换成你2里面的表名,当然小编这里只是建议。

 

②递归父节点

那么接下来的递归所有的父节点,也是同样的道理,

咱们先创建辅助函数getParList(),


CREATE FUNCTION `getParList`(rootId INT)
RETURNS varchar(1000) 
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempPar VARCHAR(1000); 
    SET sTemp = ''; 
    SET sTempPar =rootId; 
 

    WHILE sTempPar is not null DO 
        
        IF sTemp != '' THEN
            SET sTemp = concat(sTemp,',',sTempPar);
        ELSE
            SET sTemp = sTempPar;
        END IF;
        SET sTemp = concat(sTemp,',',sTempPar); 
        SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>0; 
    END WHILE; 
 
RETURN sTemp; 
END

这个也是一样,不要盲目的复制过去执行,要跟你的表一一对应,我已经帮大家标记好了,将1到5的数据,换成你创建的表名主键,表名和表示上级的字段,6可改可不改,你怎么高兴怎么来

 

4.总结

上面这些,就是小编在用mysql递归查询遇到的坑,如果你还没有遇到,恭喜你,看完这篇文章可以避免踩坑了,但是记得点个赞吖。哈哈哈哈哈。如果大家对于mysql有更好的方法以及自己的独特见解,欢迎在留言处留言或者留下你的文章链接,咱们一起学习一起进步

参考文章

https://blog.csdn.net/jian_c/article/details/79854491

https://www.cnblogs.com/xiaoxi/p/5942805.html

感谢原作者的分享,让技术人能够更快的解决问题

原文地址:https://www.cnblogs.com/jalenFish/p/14099034.html