前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql递归查询方法|mysql递归查询遇到的坑,教你们解决办法

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

作者头像
小小鱼儿小小林
发布2020-06-23 16:31:15
1.4K0
发布2020-06-23 16:31:15
举报
文章被收录于专栏:灵儿的笔记

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(),如下代码

代码语言:javascript
复制
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(),

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/10/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.踩坑介绍
  • 3.埋坑教程
    • ①递归子节点
      • ②递归父节点
      • 4.总结
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档