zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    公司的首页
    ubuntu 无法在Eclipse中识别 设备
    Eclipse 和 Android Studio 并存
    Eclipse 和 Android Studio 并存
    mac 节约硬盘空间
    一公升的眼泪
    Mac Ogre
    代码大全 是极好的
    Ogre Ubuntu 环境搭建
    cocos2d-x 环境搭建 c++ 版本
  • 原文地址:https://www.cnblogs.com/jalenFish/p/14099034.html
Copyright © 2011-2022 走看看