递归的实际业务场景之MySQL 递归查询
喜欢就点个赞呗!
源码<--请点击此处查看
引入
当我看到一些评论时,例如下面的样子。我挺好奇这个功能是怎么样做出来的。进过查阅资料,发现这其实是 MySQL 的递归操作。下面就让我操作一下怎么实现 MySQL 的递归查询。

设计数据库
观察这种数据库设计,你会发现他都有一个父节点,一直到根节点,所以我们设计数据库的时候,应该设置一个 parentid 字段。所以,我们可以得到以下的数据库。

sql 脚本如下
CREATE TABLE digui(
id INT(11) NOT null auto_increment,
msg VARCHAR(255) not NULL COMMENT '评论的内容',
parentid int(11) not null COMMENT '上一条',
PRIMARY KEY(id)
)ENGINE=INNODB auto_increment = 100 DEFAULT CHARSET=utf8mb4;
INSERT into `digui`(msg, parentid) VALUES ('A', 0);
INSERT into `digui`(msg, parentid) VALUES('B', 1);
INSERT into `digui`(msg, parentid) VALUES('D', 3);
INSERT into `digui`(msg, parentid) VALUES('C', 2);
其实实现 MySQL 的递归查询方法有很多
- 使用 MySQL 存储过程
- 应用层代码递归
- MyBatis 的 collection 标签
方案1 应用层代码递归
//应用层递归查询
@Override
public List<Digui> getAll(int parent) {
List<Digui> deptVosList=new ArrayList<>();
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parentid", parent);
List<Digui> list1 = list(queryWrapper);
for (Digui digui: list1) {
Digui digui1 = new Digui();
digui1.setId(digui.getId());
digui1.setMsg(digui.getMsg());
digui1.setParentid(digui.getParentid());
// 此处递归调用赋值
digui1.setDiguiList(getAll(digui.getId()));
deptVosList.add(digui1);
}
return deptVosList;
}
方案2 MyBatis 的 collection 标签
<resultMap id="RecursiveMap" type="com.example.lsbdigui.entity.Digui">
<result property="id" column="id"/>
<result property="msg" column="msg"/>
<result property="parentid" column="parentid"/>
<collection property="diguiList" ofType="com.example.lsbdigui.entity.Digui"
select="com.example.lsbdigui.mapper.DiguiMapper.getAllBySQL"
column="id"/>
</resultMap>
<select id="getAllBySQL" resultMap="RecursiveMap">
select *
from digui
where parentid = #{parent}
</select>
使用<collection> 、<select>标签实现 sql 递归查询。
结果
{
"code": 200,
"msg": "正确返回",
"date": [
{
"id": 100,
"msg": "A",
"parentid": 0,
"diguiList": [
{
"id": 101,
"msg": "B",
"parentid": 100,
"diguiList": [
{
"id": 103,
"msg": "C",
"parentid": 101,
"diguiList": [
{
"id": 102,
"msg": "D",
"parentid": 103,
"diguiList": []
}
]
}
]
}
]
}
]
}
对比

建议
应用层可以一次查询全部数据,然后再递归找出需要的数据,这样可以减少数据库查询,性能更佳。
参考
- https://blog.rxliuli.com/p/5830226b/
- https://juejin.im/entry/59be34fe5188257e8b36a303
- https://blog.csdn.net/u014079773/article/details/53338116
关注微信公众号,随时移动端阅读

递归的实际业务场景之MySQL 递归查询的更多相关文章
- Mysql存储引擎概念特点介绍及不同业务场景选用依据
目录 MySQL引擎概述 1 MySAM引擎介绍 2 什么是InnoDB引擎? 3 生产环境中如何批量更改MySQL引擎 4 有关MySQL引擎常见企业面试题 MySQL引擎概述 Mysql表存储结构 ...
- 【源码讲解】Spring事务是如何应用到你的业务场景中的?
初衷 日常开发中经常用到@Transaction注解,那你知道它是怎么应用到你的业务代码中的吗?本篇文章将从以下两个方面阐述Spring事务实现原理: 解析并加载事务配置:本质上是解析xml文件将标签 ...
- 受教了,memcache比较全面点的介绍,受益匪浅,适用memcached的业务场景有哪些?memcached的cache机制是怎样的?在设计应用时,可以通过Memcached缓存那些内容?
基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...
- MongoDB 比较适用哪些业务场景?
在云栖社区上发起了一个 MongoDB 使用场景及运维管理问题交流探讨的技术话题,有近5000人关注了该话题讨论,这里就 MongoDB 的使用场景做个简单的总结,谈谈什么场景该用 MongoDB ...
- 秒杀场景下MySQL的低效(转)
秒杀场景下MySQL的低效 2016-01-14 17:12 178人阅读 评论(0) 收藏 举报 最近业务试水电商,接了一个秒杀的活.之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己 ...
- 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录
从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场. ...
- MongoDB 比较适用哪些业务场景
转载自:https://www.cnblogs.com/williamjie/p/10416294.html 在云栖社区上发起了一个 MongoDB 使用场景及运维管理问题交流探讨的技术话题,有近50 ...
- MySQL递归查询
MySQL8.0已经支持CTE递归查询,举例说明 CREATE TABLE EMP (EMPNO integer NOT NULL, ENAME ), JOB ), MGR integer, HIRE ...
- 整理分布式锁:业务场景&分布式锁家族&实现原理
1.引入业务场景 业务场景一出现: 因为小T刚接手项目,正在吭哧吭哧对熟悉着代码.部署架构.在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导 ...
随机推荐
- nyoj 33-蛇形填数 (循环,模拟)
33-蛇形填数 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:15 submit:38 题目描述: 在n*n方陈里填入1,2,...,n*n,要求填 ...
- React-基础总结
使用1. // js文件,第一部引入React(大写,不然保错) import React from 'react' // 创建数组 const arrList = Array.from({lengt ...
- JVM集训-----内存结构
一.程序计数器/PC寄存器 (Program Counter Registe) 用于保存当前正在执行的程序的内存地址(下一条jvm指令的执行地址),由于Java是支持多线程执行的,所以程序执行的轨迹不 ...
- 前端的构建化工具Webpack
经常看到如jquery-3.0.0.js和jquery-3.0.0-min.js等两相似的文件名. 其实以上两个文件名的内容是一样的,不过带min代表的是占用最小的空间,为项目提高性能.压缩的部分如换 ...
- go中的关键字-go(上)
1. goroutine的使用 在Go语言中,表达式go f(x, y, z)会启动一个新的goroutine运行函数f(x, y, z),创建一个并发任务单元.即go关键字可以用来开启一个gorou ...
- 【集合系列】- 深入浅出的分析 WeakHashMap
一.摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap.LinkedHashMap.TreeMap.IdentityHashMap.WeakHashMap.Hashtable.P ...
- git 删除误上传的.idea文件
问题: 提交项目的时候忘记添加.gitignore文件,误上传了文件(如.idea)如何解决?(本文以.idea文件夹举例) 1.将项目文件拉取下来 git pull origin master 2. ...
- CSS中如果实现元素浮动,看这篇文章就足够了
浮动基本介绍 在标准文档流中元素分为2种,块级元素和行内元素,如果想让一些元素既要有块级元素的特点也同时保留行内元素特点,只能让这些元素脱离标准文档流即可. 浮动可以让元素脱离标准文档流,可以实现让多 ...
- [ASP.NET Core 3框架揭秘] 配置[1]:读取配置数据[上篇]
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...
- Java8 Stream中间操作使用详解
前面两篇简单的介绍了Stream以及如何创建Stream,本篇就给大家说说stream有哪些用途,以及具体怎样使用. 再次介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的 ...