MySQL 递归查询实践总结
MySQL复杂查询使用实例
By:授客 QQ:1033553122
表结构设计
SELECT id, `name`, parent_id FROM `tb_testcase_suite`

说明:
parent_id值关联表自身id列的值,如果其值为-1,则表示该记录不存在父级记录,否则表示该记录存在父级记录(假设parent_id值为5,则父级记录id为5),暂且把该记录自身称之为子记录,父级及父父级的记录称之为祖先记录,子级及子子级记录称之为后辈记录
查询需求
1) 根据指定记录的id,查询该记录关联的所有祖先记录,并按层级返回祖先记录name
2) 根据指定parent_id,查询其关联的的所有后辈记录id
查询实现
通过函数调用实现
1)根据指定记录的id,查询该记录关联的所有祖先记录,并按层级返回祖先记录name
# 向上递归
DROP FUNCTION IF EXISTS querySuitePath;
DELIMITER ;;
CREATE FUNCTION querySuitePath(suiteId INT)
RETURNS VARCHAR(21845)
BEGIN
DECLARE suitePath VARCHAR(21845);
DECLARE parentId INT;
DECLARE suiteName VARCHAR(4000);
SET suitePath='';
SET suiteName = '';
SET parentId = NULL;
SELECT parent_id, `name` INTO parentId, suiteName FROM tb_testcase_suite WHERE id = suiteId;
WHILE parentId <>0 DO
SET suitePath = CONCAT(suiteName, '/', suitePath);
# 以下两行代码很关键 # 查询结果为空时,不会执行select ...into...这个赋值操作,导致parentId一直取最后一次查到的非0值,进而导致死循环
SET suiteId = parentId;
SET parentId = 0;
SELECT parent_id, `name` INTO parentId, suiteName FROM tb_testcase_suite WHERE id = suiteId;
END WHILE;
RETURN CONCAT('/', suitePath);
END
;;
DELIMITER ;
# 调用
SELECT querySuitePath(5);

SELECT id, querySuitePath(id), `name`, parent_id FROM `tb_testcase_suite`

2)根据指定parent_id,查询其关联的的所有后辈记录id
# 向下递归
DROP FUNCTION IF EXISTS queryChildrenSuiteIds;
DELIMITER ;;
CREATE FUNCTION queryChildrenSuiteIds(suiteId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE childSuiteIds VARCHAR(4000);
DECLARE parentSuiteIds VARCHAR(4000);
SET childSuiteIds='';
SET parentSuiteIds = CAST(suiteId AS CHAR);
WHILE parentSuiteIds IS NOT NULL DO
SET childSuiteIds= CONCAT(parentSuiteIds, ',', childSuiteIds);
SELECT GROUP_CONCAT(id) INTO parentSuiteIds FROM tb_testcase_suite WHERE FIND_IN_SET(parent_id, parentSuiteIds)>0;
END WHILE;
RETURN childSuiteIds;
END
;;
DELIMITER ;
# 调用
SELECT queryChildrenSuiteIds(5);

MySQL 递归查询实践总结的更多相关文章
- paip.python连接mysql最佳实践o4
paip.python连接mysql最佳实践o4 python连接mysql 还使用了不少时间...,相比php困难多了..麻烦的.. 而php,就容易的多兰.. python标准库没mysql库,只 ...
- 包含mysql 递归查询父节点 和子节点
包含mysql 递归查询父节点 和子节点 mysql递归查询,查父集合,查子集合 查子集合 --drop FUNCTION `getChildList` CREATE FUNCTION `getChi ...
- MySQL · 最佳实践 · 分区表基本类型
MySQL · 最佳实践 · 分区表基本类型 MySQL分区表概述 随着MySQL越来越流行,Mysql里面的保存的数据也越来越大.在日常的工作中,我们经常遇到一张表里面保存了上亿甚至过十亿的记录.这 ...
- Memcached+PHP+Mysql+Linux 实践
首先确保你的服务器环境已经具备了memcached和lamp,关于在Linux上搭建memcahced+php环境可以参考我的另外一篇帖子( http://www.cnblogs.com/codeAB ...
- MySQL 开发实践 8 问,你能 hold 住几个?
最近研发的项目对DB依赖比较重,梳理了这段时间使用MySQL遇到的8个比较具有代表性的问题,答案也比较偏自己的开发实践,没有DBA专业和深入,有出入的请使劲拍砖!- MySQL读写性能是多少,有哪些性 ...
- MySQL 开发实践
最近研发的项目对DB依赖比较重,梳理了这段时间使用MySQL遇到的8个比较具有代表性的问题,答案也比较偏自己的开发实践,没有DBA专业和深入,有出入的请使劲拍砖!- MySQL读写性能是多少,有哪些性 ...
- MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用
1-前言: 在Mysql使用递归查询是很不方便的,不像Sqlserver可以直接使用声明变量,使用虚拟表等等.如:DECLARE,BEGIN ... END ,WHILE ,IF 等等. 在My ...
- MySQL递归查询树状表的子节点、父节点具体实现
mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算 ...
- 递归的实际业务场景之MySQL 递归查询
喜欢就点个赞呗! 源码<--请点击此处查看 引入 当我看到一些评论时,例如下面的样子.我挺好奇这个功能是怎么样做出来的.进过查阅资料,发现这其实是 MySQL 的递归操作.下面就让我操作一下怎么 ...
- MySQL递归查询
MySQL8.0已经支持CTE递归查询,举例说明 CREATE TABLE EMP (EMPNO integer NOT NULL, ENAME ), JOB ), MGR integer, HIRE ...
随机推荐
- Android 12(S) Binder(二)
前面一节学习了ServiceManager这个特殊service的工作过程,这一节来看看普通service的工作过程. 就用media.extractor这个service来当例子! 1.服务的注册及 ...
- 8.11考试总结(NOIP模拟36)[Dove 打扑克·Cicada 与排序·Cicada 拿衣服]
我会化作人间的风雨陪在你的身边 T1 Dove 打扑克 解题思路 考场上是想了一个树状数组维护的打法,但是竟然和 \(qn^2\) 的算法一样是 65pts 暴力就是对于每一次 2 询问重新建一下树状 ...
- js 检测文本是否溢出
自定义指令的方式 手写实现 /** * 检测文本是否溢出 * 参考 https://github.com/ElemeFE/element/blob/dev/packages/table/src/tab ...
- Java中File类和I/O
目录 File 类 File 构造方法 输入输出(I/O) 字节流与字符流 输入流与输出流 输入输出字节流 构造方法 方法 InputStream 基本方法 public int read() thr ...
- Qt OPC UA通信
介绍 OPC UA全称Open Platform Unified Architecture,开放平台统一架构,是工业自动化领域通用的数据交换协议,它有两套主要的通信机制:1.客户端-服务器通信:2.发 ...
- css3颜色模式 圆角的实现 width的属性值 触发怪异盒模型
Css颜色模式: rgb(255,0,0) rgba(255,0,0,0.5)(0.5是透明度) hsl(58%,56%)色彩饱和度 hala() border-image url(路径) 向内偏 ...
- kettle从入门到精通 第四十九课 ETL之kettle 自定义插件01
1.kettle插件是什么 kettle本身有足够多的转换或者job步骤,但是依然不能覆盖所有的业务场景,所以Kettle 自定义插件在有些独特的业务场景可以大显身手. Kettle的插件架构使得我们 ...
- 支付宝支付jemter 插件,导入到高版本jmeter 中使用
官方支付宝压力测试文档中: 蚂蚁金服开放平台 - 文档中心 (alipay.com) 有个 temp.jmx 文件(http://p.tb.cn/rmsportal_10157_temp.jmx.zi ...
- 查看mongo的bson数据文件
转载请注明出处: BSON(Binary Serialized Document Format)是MongoDB中用于存储和传输数据的一种二进制形式的存储格式,它基于JSON格式,但比JSON更松散, ...
- 『vulnhub系列』HMS-1
『vulnhub系列』HMS?-1 下载地址: https://www.vulnhub.com/entry/hms-1,728/ 信息搜集: 使用nmap进行存活主机探测,发现开启了21端口(ftp) ...