课题:如何利用mysql遍历树形结构(获取一个节点的所有子节点/父节点)

方案:自定义mysql函数

树形表结构:

CREATE TABLE `tbl_tree` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`father_id` bigint(20) NOT NULL,

PRIMARY KEY (`id`),

KEY `father_id` (`father_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

自定义mysql函数函数:

1. 获取节点的子节点

CREATE FUNCTION `getChildLst`(rootId INT)

RETURNS varchar(1000)

BEGIN

DECLARE sTemp VARCHAR(1000);

DECLARE sTempChd VARCHAR(1000);

SET sTemp = '';

SET sTempChd =cast(rootId as CHAR);

loop1:LOOP

SELECT group_concat(id) INTO sTempChd FROM tbl_tree where FIND_IN_SET(father_id,sTempChd)>0;

IF sTempChd is not null THEN

SET sTemp = concat(sTemp,',',sTempChd);

ELSE

LEAVE loop1;

END IF;

END LOOP;

SET sTemp = TRIM(',' FROM sTemp);

RETURN sTemp;

END

2. 获取节点的父节点

CREATE FUNCTION `getFatherLst`(rootId INT)

RETURNS varchar(1000)

BEGIN

DECLARE sTemp VARCHAR(1000);

DECLARE sTempPrt VARCHAR(1000);

SET sTemp = '';

SET sTempPrt = cast(rootId as CHAR);

loop1:LOOP

SELECT group_concat(father_id) INTO sTempPrt FROM tbl_tree where FIND_IN_SET(id,sTempChd)>0;

IF sTempPrt is not null THEN

SET sTemp = concat(sTemp,',',sTempPrt);

ELSE

LEAVE loop1;

END IF;

END LOOP;

SET sTemp = TRIM(',' FROM sTemp);

RETURN sTemp;

END

优化后的查询语句:

1. 获取子节点

select A.* from tbl_tree A inner join (select getChildLst(1) as idArr) TEMP where FIND_IN_SET(A.id, TEMP.idArr);1. 获取父节点

select A.* from tbl_tree A inner join (select getFatherLst(15000) as idArr) TEMP where FIND_IN_SET(A.id, TEMP.idArr);

mysql树形遍历_mysql树形结构遍历相关推荐

  1. mysql表的遍历_MySQL 全表遍历

    今天做一个业务需求的逻辑处理,需要对MySQL全表进行遍历,数据规模百万级别,为方便描述,这张表就用 a 来代替吧 结合自己的思路和一些资料,在这里记录一下方案的进化史 一.直接遍历拿出所有的数据 s ...

  2. mysql 叶子节点_MySQL 树形结构 根据指定节点获取其所有叶子节点

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点. 叶子节点:如果一个节点下不再有子节点,则为叶子节点. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合 ...

  3. mysql存储树结构_mysql 树形结构查询(存储过程)

    就用数据数据库表地址数据(中国地区) 来说吧(用Windows 请使用 gbk !!) 可直接运行(去除注解) 存储过程: DELIMITER//dropprocedureifexistsfindLC ...

  4. mysql 游标循环_mysql for循环遍历 游标用处

    以前一直不知道游标的作用,之前的结果集遍历 博主一直用的是记录查询出来的记录总数并一条条用LIMIT 1 OFFSET index 进行查找,并进行处理的. 现在终于会使用游标了,献上一个小例子供大家 ...

  5. matlab根据结构体数组,用邻接矩阵和序遍历创建树形结构:

    matlab根据结构体数组,用邻接矩阵和先序遍历创建树形结构: https://blog.csdn.net/C_Redrock/article/details/84980241

  6. 树形结构:迭代方式遍历树,宽度优先,先序遍历,中序遍历,后序遍历

    迭代的方式处理树,就必须清楚你将要访问的顺序,对应的就是指针怎么走,你必须很清楚 树的宽度优先搜索,他是一层一层的访问,就搞不清楚怎么划分子问题了,但是你访问的顺序 你很清楚,那么就使用迭代的方式实现 ...

  7. elementUI中el-table树形与el-tree树形结构的一键折叠与展开

    elementUI中el-table树形与el-tree树形结构的一键折叠与展开 1.业务需求: vue项目,权限菜单管理中菜单table的树形结构,一般情况下如果使用的是elementUI那么可以使 ...

  8. PHP 数组遍历 foreach 语法结构

    来源:http://www.cnblogs.com/keta/p/6117237.html foreach 语法结构用于遍历数组. foreach() PHP foreach() 语法结构用于遍历操作 ...

  9. 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

    二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或 ...

最新文章

  1. Transact_SQL小手册
  2. 传Facebook将推出应用中心挑战谷歌搜索地位
  3. 假定某一个数据列表是一个班级的计算机课程,若需要利用形参直接访问实参,则应把形参变量说明为()参数。A.指针B.引用C.传值D.常值...
  4. 银行不告诉的秘密,看完豁然大悟
  5. 硅谷经历 7 场面试,我是如何最终进入 Facebook 的
  6. 深入理解Linux系统中的用户和组账号
  7. 网络运维超融合服务器,15. 通过 Openfiler 软件:配置 ISCSI 和
  8. ExtJS4.2学习(13)基于表格的扩展插件---rowEditing
  9. 计算机二级lookup函数,LOOKUP函数用法全解(下)——LOOKUP函数的二分法原理
  10. java 以2为底的对数_如何计算Java中以整数为底的对数2?
  11. 女人,百花千红你最美
  12. JSON Views 基本用法
  13. python自定义标识符的使用区分大小写吗_Python中的标识符是不区分大小写的
  14. 阿里云CAC_DevOps课程详细文字文档
  15. 图解Redis中的9种数据结构(高级面试,必备)
  16. 【链块技术10期】区块链基础语言(二)——GO语言开发环境搭建
  17. 视频号该怎么去运营;有人已经利用视频号赚到了第一笔金了丨国仁网络资讯
  18. android 高德地图移动卡顿_使用高德SDK开发安卓地图应用软件
  19. npm 包管理及 registry 或 proxy 配置
  20. php卡片式,卡片式设计的优点和不适用性

热门文章

  1. Ubuntu建立和删除用户
  2. Ubuntu12.04安装JDK6
  3. PostgreSQL的实践一:初识
  4. CTF-i春秋网鼎杯第一场misc部分writeup
  5. 广发银行运维实践分享:Docker适配传统运维那些事
  6. Redhat Linux通过RPM安装搭建LAMP环境
  7. (二)把域服务升级和迁移到Windows Server 2012 R2上
  8. 谈谈NITE 2与OpenCV结合的第二个程序(提取人体骨骼坐标)
  9. 十进制转换二进制(原码)
  10. Android开发框架afinal实践