MySql树形结构(多级菜单)查询设计方案

Mysql树形表的两种查询方案(递归与自连接) mysql树形查询实现 阅读详情

背景

又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护

工作中(尤其是传统项目中)经常遇到这种需要,就是树形结构的查询(多级查询),常见的场景有:组织架构(用户部门)查询 和 多级菜单查询

比如,菜单分为三级,一级菜单、二级菜单、三级菜单,要求用户按树形结构把各级菜单查询出来。如下图所示

对于层级固定,层级数少的,一般3级,需求实现很简单,先查询最小子级,再依次查询上级,最后再组装返回给前端就是了。

那么问题来了,如果层级数很大,10级,或者干脆层级不确定,有的3级,有的5级,有的8级,与之前的层级固定,层级数相比,显然问题更复杂了,我们来看看这种怎么处理

三级查询(层级固定,层级数少)

这种情况,我们只需要一张表,就叫它树形表吧:

CREATE TABLE tree (
	id int not null auto_increment,
	name varchar(50) not null comment '名称',
	parent_id int not null default 0 comment '父级id',
	level int not null default 1 comment '层级,从1开始',
    created datetime,
    modified datetime
);

三级查询过程:查询出三级tree, 根据三级tree的 parent_id 查询出二级tree, 同样的方式再去查询出一级tree, 后端组装成树状数据,返回给前端。

多级查询(层级不固定/层级很深)

这种情况,我们首先想到的就是子查询或者联表查询,但是肯本不能在实际开发中使用,原因大家都知道:

  1. sql语句复杂,容易出错
  2. 性能问题,可能会被领导干

所以最好的方式就是,加一张表 tree_depth,来维护层级深度关系。

CREATE TABLE tree_depth (
	id int not null auto_increment,
	root_id int not null default 0 comment '根节点(祖先节点)id',
    tree_id int not null default 0 comment '当前节点id',
	depth int not null default 0 comment '深度(当前节点 tree_id 到 根节点 root_id 的深度)',
    created datetime
);

表中 depth 字段表示的是: 当前节点 tree_id 到 根节点 root_id 的深度,不是当前节点所在整个分支的深度,所有节点相对于自身的深度都是0

有了 tree_depth 表后,查询一个N级节点的组织数据就方便了:

遍历整个树:

直接查 tree 中所有 level = 1 的节点,在出去这些节点的 id 根据 parent_id 去查下级节点, 查询完所有的节点,就可以组装成一个完整的树状图返回给前端

节点搜索(查找出这个节点所在的整个分支)

  1. 从 tree 表查询出节点 treeN
    select * from tree where id = N
  2. 根据 treeN 的 id 值,到 tree_depth 表查询出它的 根节点id:
    select root_id from tree_depth where tree_id = #{treeId}
  3. 根据 root_id 查询 tree_depth 的 所有当前节点分支数据
    select * from tree_depth where root_id = #{rootId}
  4. 从查询出 tree_depth 表数据中取出所有当前节点 tree_id
    select * from tree where id in (?,?,?)
  5. 组装所在分支树状结构

总结

  1. 多级查询、三级查询本质就是树形结构的遍历,推荐使用多级查询的方式,相比三级查询多级查询的方式抓住了树形结构遍历的本质,方便扩展和维护。
  2. 技术只是工具,多级查询的方式不是固定的,查询方式合理既可,但通常都需要加关系表辅助设计

 

MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题) 阅读详情

相关推荐

实现MySQL中查询树形结构子项列表的函数

自连接是数据库查询中的一种特殊技巧,它允许一个表与自身进行连接操作。通过为同一个表指定不同的别名,可以模拟出表内部的关联。这一技术广泛应用于需要递归查询的场景,比如组织结构、分类目录、文件系统等层级关系的数据查询。在处理树形数据时,自连接特别有用。它能够将数据的层级关系清晰地展现出来,便于进行父子节点间的数据访问。借助自连接,可以在不依赖于递归存储过程或函数的情况下,直接从数据库层面实现复杂的层级数据查询。在MySQL 8.0及以上版本中,可以使用语法更简单地实现递归查询。以下是使用。

weixin_34885746的博客 855

MySQL查询树形结构数据

【代码】MySQL查询树形结构数据。

qq_49912622的博客 3245

多级目录的数据库设计

多级目录数据库设计方案 在实际工作中,经常碰到需要多级目录的情况,例如设计一个论坛,它的版面是分级的,而且为了灵活扩展,这种分级是没有限制的,也就是说设计者,不限制用户设定多少级目录。

MySQL树状结构表查询通解

通解MySQL中树状结构表的查询

qq_51763048的博客 5797

mysql 树形结构查询

mysql 树形结构查询,使用存储过程,实现mysql的树形结构查询

基于PSO-BP神经网络的风电功率预测研究论文复现

风电功率预测。基于PSO-BP神经网络的风电功率预测论文复现。matlab程序,注释清晰。

weixin_825487230的博客 2295

mysql数据库递归查询树形结构(适用场景:菜单多级分类,多级关联评论查询),用strea流把list转成树的方法详解

mysql数据库递归查询树形结构(适用场景:菜单多级分类,多级关联评论查询),用strea流把list转成树的方法详解

qq_26112725的博客 9196

保姆级避坑指南:用Keil和J-Flash搞定凌思微LE5010蓝牙芯片的首次程序下载

本文提供了一份详细的保姆级避坑指南,帮助开发者使用Keil和J-Flash工具完成凌思微LE5010蓝牙芯片的首次程序下载。文章重点解决了算法文件混淆、协议栈漏烧和仿真器连接异常等常见问题,并详细介绍了开发环境配置、协议栈烧录和下载接口的物理层奥秘,助力开发者高效完成蓝牙开发任务。

weixin_28739079的博客 466

如何根据树形结构表的最后一层ID查询其所有上级菜单数据

通过使用递归查询,可以非常方便地根据树形结构表的最后一层ID查询其所有上级菜单数据。递归CTE提供了简洁而高效的方式来处理这种层级关系查询,尤其适用于树形结构和父子关系较复杂的场景。在MySQL 8.0及以上版本中,这种方法是非常推荐的解决方案。

nbsaas-boot基于Request-Response的企业级快速开发框架 1292

Excel也能玩转K-means聚类?手把手教你用表格搞定用户分群(附完整公式)

本文详细介绍了如何在Excel中实现K-means聚类算法,无需编程即可完成用户分群。通过SUMIF、SQRT等基础函数,从数据预处理到最终分群全流程手把手教学,特别强调数据标准化和迭代优化的关键步骤,帮助运营团队低成本高效分析用户行为数据。

weixin_30555125的博客 180

同源策略与跨域

前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到。大致看了下腾讯云关于设置跨域访问的教程,按照前端同学给的域名等选项就给配了,而且测试下来也是好的。但是呢一直不知道什么是跨域这里就做一个简单的学习记录。 一、同源策略 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。...

mijichui2153的博客 1万+

MySQL 实现树形的遍历 关于多级菜单栏以及多级上下部门的查询问题

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!                前言:&nbs

hfdchhu的博客 338

华南理工大学电子与信息学院23年预推免复试面试经验贴

华南理工大学电子与信息学院23年预推免复试面试经验贴

Scut_Ty的博客 3295

mysql树形查询三级_[MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)...

前言:关于多级别菜单栏或者权限系统中部门上下级的树形遍历,oracle中有connect by来实现,mysql没有这样的便捷途径,所以MySQL遍历数据表是我们经常会遇到的头痛问题,下面通过存储过程来实现。1,建立测试表和数据:DROP TABLE IF EXISTS csdn.channel;CREATE TABLE csdn.channel (id INT(11) NOT NULL AUTO...

weixin_39841610的博客 1256

AIGC算法工程师-面试八股文-2025年版本-算法八股文/工程八股文/开放式问题

​两年前整理了《AIGC算法工程师 面试八股文》,全网一共有100w读者看过,收到了很多小伙伴的催更。Diffusion的技术发展非常快,博主特意整理了最近两年最新的八股文,内容非常全面,涵盖算法八股文/工程八股文/开放式问题三个大类,希望能为求职的读者们带来帮助。

沉迷单车的追风少年 4181

OpenCV 基于上升距离计算边缘清晰度

OpenCV 基于上升距离计算边缘清晰度

dayuhaitang1的博客 253

MySQL 树形结构的菜单表设计与查询

叙述 开发中经常会遇到树形结构的场景,比如:导航菜单、组织机构等等,但凡是有这种父子层级结构的都是如此,一级类目、二级类目、三级类目。。。 对于这种树形结构的表要如何设计呢?接下来一起探讨一下 首先,想一个问题,用非关系型数据库存储可不可以? 答案是肯定可以的,比如用mongoDB,直接将整棵树存成json。但是,这样不利于按条件查询,当然也取决于具体的需求,抛开需求谈设计都是耍流氓。 在菜单这个场景下,一般还是用关系型数据库存储,可以将最终的查询结构缓存起来。 解决方案 常用的方法有四种:

lizhengyu891231的博客 7217

YOLOv26与其他目标检测算法的对比分析

本文对YOLOv26与其他主流目标检测算法进行了全面对比分析。YOLOv26在COCO数据集上达到96.0% mAP@0.5和79.0% mAP@0.5:0.95,显著优于其他YOLO系列算法,同时保持85FPS的推理速度和35MB的轻量级模型。相比两阶段算法(如Faster R-CNN),YOLOv26在速度、模型大小和内存占用方面优势明显;相比Anchor-free算法(如CenterNet),YOLOv26在速度和模型压缩方面更优。其核心创新包括动态锚框分配、自注意力机制和轻量级设计,使其成为适用于复

一键难忘的博客 993

数据库树形结构查询

数据库树形结构查询 Oracle实现方式 数据库树形结构,正反遍历 --从Root往树末梢递归 select level ,identity,pid from table_name start with identity=475 connect by prior identity = pid --从末梢往树ROOT递归 select level ,identi...

kexinxin1的博客 2835

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mysql菜单树path查询_[MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)...

3,开始测试:3.1,从根节点开始显示,显示子节点集合:mysql> CALL pro_show_childLst(-1);+----+-----------------------+-----------+-------+-------------+----------------------------+| id | NAME | parent_id |...

weixin_39939661的博客 824

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL多层级菜单表结构及树形结构查询

本文介绍了MySQL中多层级菜单表的设计方案及四种树形结构查询方法:1)MySQL 8.0+推荐使用递归CTE查询;2)适用于固定深度的简单层级查询;3)MySQL 5.8以下版本可用的存储过程实现;4)使用变量实现有序树查询。重点展示了递归CTE查询方案,包含完整SQL示例,能获取菜单层级、路径等信息。同时提供了前端展示优化的查询建议,帮助开发者高效处理树形结构数据。

博客 292

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

springboot怎样构造树形结构数据并查询?

因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-puls+mysql,示例的接口是查询一级权限以及二级权限、三级权限整个权限树… 下面是导入的maven依赖 <!--数据库连接--> <dependency> <groupId>com.alibaba</groupId>

一往无前的博客 5964

在springboot项目中如何根据部门ID查询其上下级所有数据,生成树形结构的数据

mysql数据库的部门表结构: 需求:将部门的树形结构数据已JSON形式返回给前端 解决思路: 1、先获取当前部门的所有父级节点, 2、再获取当前部门的所有子节点, 3、查询组合(父级节点、当前节点、子节点组合起来)后的节点数据 4、在java中进行遍历生成树形菜单 具体操作如下: 1、部门的实体VO @Data public class DepartmentVO { private int id; //部门ID private.

wzwsq的博客 7383

mysql树形结构查询子节点

查询所有子节点 需求: 在树形的节点关系下,比如菜单树或者文件目录树,要想获取某个节点的所有子节点,或者所有父类节点,在知道节点树最大层级的情况下 id, parent_id eg: 已知节点树深度不超过10, 查询所有子节点如下 select org.id as id, concat('[', concat_ws(',', group_concat(distinct ...

pushiqiang的博客 1570

JAVA查询所有菜单mysql_mysql 递归菜单查询函数 java jdbc简单实现

最简单的父子结构表函数创建语句:select version();#5.7.26show variables like "sql_mode";#sql_modeONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_EN...

weixin_32306683的博客 276

MySQL部门或菜单父子节点递归实现树查询

目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,可以在一句SQL内实现树的递归查询下面给一个小示例,后续在贴上调用的代码(代码会贴在最后请注意)MySQL递归查询所有子节点,树形结构查询--表结构CREATE TABLE `address` (`id` int(11) NOT NULL AUTO_INCREMENT,`code_value` varchar(32) DE...

xiao雷博客 3万+
上一篇: 面试题:为什么不建议在MySQL中使用UTF-8?
下一篇: 使用MinIO构建分布式文件系统来一次分布式文件系统实战!
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值