返回顶部
首页 > 资讯 > 数据库 >mysql的树形结构存储及查询实例分析
  • 912
分享到

mysql的树形结构存储及查询实例分析

2023-06-29 20:06:58 912人浏览 泡泡鱼
摘要

这篇文章主要介绍“mysql的树形结构存储及查询实例分析”,在日常操作中,相信很多人在Mysql的树形结构存储及查询实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql的树形结构存储及查询实例分析

这篇文章主要介绍“mysql的树形结构存储及查询实例分析”,在日常操作中,相信很多人在Mysql的树形结构存储及查询实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql的树形结构存储及查询实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

存储parent

这种方式就是每个节点存储自己的parent_id信息

  • 建表及数据准备

CREATE TABLE `menu` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(50) NOT NULL,  `parent_id` int(11) NOT NULL DEFAULT '0',  PRIMARY KEY (`id`)) ENGINE=InnoDB;INSERT INTO `menu` (`id`, `name`, `parent_id`) VALUES(1, 'level1a',  0),(2, 'level1b', 0),(3, 'level2a-1a',1),(4, 'level2b-1a',1),(5, 'level2a-1b', 2),(6, 'level2b-1b', 2),(7, 'level3-2a1a', 3),(8, 'level3-2b1a', 4),(9, 'level3-2a1b', 5),(10, 'level3-2b1b', 6);
  • 查询

-- 查询跟节点下的所有节点SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3FROM menu AS t1LEFT JOIN menu AS t2 ON t2.parent_id = t1.idLEFT JOIN menu AS t3 ON t3.parent_id = t2.idWHERE t1.name = 'level1a';+---------+------------+-------------+| lev1    | lev2       | lev3        |+---------+------------+-------------+| level1a | level2a-1a | level3-2a1a || level1a | level2b-1a | level3-2b1a |+---------+------------+-------------+-- 查询叶子节点SELECT t1.name FROMmenu AS t1 LEFT JOIN menu as t2ON t1.id = t2.parent_idWHERE t2.id IS NULL;+-------------+| name        |+-------------+| level3-2a1a || level3-2b1a || level3-2a1b || level3-2b1b |+-------------+

存储及修改上比较方便,就是要在sql里头查询树比较费劲,一般是加载到内存由应用自己构造

存储path

这种方式在存储parent的基础上,额外存储path,即从根节点到该节点的路径

  • 建表及数据准备

CREATE TABLE `menu_path` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(50) NOT NULL,  `parent_id` int(11) NOT NULL DEFAULT '0',  `path` varchar(255) NOT NULL DEFAULT '',  PRIMARY KEY (`id`)) ENGINE=InnoDB;INSERT INTO `menu_path` (`id`, `name`, `parent_id`, `path`) VALUES(1, 'level1a', 0, '1/'),(2, 'level1b', 0, '2/'),(3, 'level2a-1a',1, '1/3'),(4, 'level2b-1a',1, '1/4'),(5, 'level2a-1b', 2, '2/5'),(6, 'level2b-1b', 2, '2/6'),(7, 'level3-2a1a', 3, '1/3/7'),(8, 'level3-2b1a', 4, '1/4/8'),(9, 'level3-2a1b', 5, '2/5/9'),(10, 'level3-2b1b', 6, '2/6/10');
  • 查询

-- 查询某个节点的所有子节点select * from menu_path where path like '1/%'+----+-------------+-----------+-------+| id | name        | parent_id | path  |+----+-------------+-----------+-------+| 1  | level1a     | 0         | 1/    || 3  | level2a-1a  | 1         | 1/3   || 4  | level2b-1a  | 1         | 1/4   || 7  | level3-2a1a | 3         | 1/3/7 || 8  | level3-2b1a | 4         | 1/4/8 |+----+-------------+-----------+-------+

查找某个节点及其子节点比较方面,就是修改比较费劲,特别是节点移动,所有子节点的path都得跟着修改

MPTT(Modified Preorder Tree Traversal)

mysql的树形结构存储及查询实例分析

不存储parent_id,改为存储lft,rgt,它们的值由树的先序遍历顺序决定

  • 建表及数据准备

CREATE TABLE `menu_preorder` (  `id` int(11) NOT NULL,  `name` varchar(50) NOT NULL,  `lft` int(11) NOT NULL DEFAULT '0',  `rgt` int(11) NOT NULL DEFAULT '0',  PRIMARY KEY (`id`)) ENGINE=InnoDB;                   1(level1a)14         2(level2a)7                8(level2b)133(level3a-2a)4 5(level3b-2a)6 9(level3c-2b)10 11(level3D-2b)12INSERT INTO `menu_preorder` (`id`, `name`, `lft`, `rgt`) VALUES(1, 'level1a', 1, 14),(2, 'level2a',2, 7),(3, 'level2b',8, 13),(4, 'level3a-2a', 3, 4),(5, 'level3b-2a', 5, 6),(6, 'level3c-2b', 9, 10),(7, 'level3d-2b', 11, 12);select * from menu_preorder+----+------------+-----+-----+| id | name       | lft | rgt |+----+------------+-----+-----+| 1  | level1a    | 1   | 14  || 2  | level2a    | 2   | 7   || 3  | level2b    | 8   | 13  || 4  | level3a-2a | 3   | 4   || 5  | level3b-2a | 5   | 6   || 6  | level3c-2b | 9   | 10  || 7  | level3d-2b | 11  | 12  |+----+------------+-----+-----+
  • 查询

-- 查询某个节点及其子节点,比如level2bselect * from menu_preorder where lft between 8 and 13+----+------------+-----+-----+| id | name       | lft | rgt |+----+------------+-----+-----+| 3  | level2b    | 8   | 13  || 6  | level3c-2b | 9   | 10  || 7  | level3d-2b | 11  | 12  |+----+------------+-----+-----+-- 查询所有叶子节点SELECT nameFROM menu_preorderWHERE rgt = lft + 1;+------------+| name       |+------------+| level3a-2a || level3b-2a || level3c-2b || level3d-2b |+------------+-- 查询某个节点及其父节点SELECT parent.*FROM menu_preorder AS node,menu_preorder AS parentWHERE node.lft BETWEEN parent.lft AND parent.rgtAND node.name = 'level2b'ORDER BY parent.lft;+----+---------+-----+-----+| id | name    | lft | rgt |+----+---------+-----+-----+| 1  | level1a | 1   | 14  || 3  | level2b | 8   | 13  |+----+---------+-----+-----+-- 树形结构展示SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS nameFROM menu_preorder AS node,menu_preorder AS parentWHERE node.lft BETWEEN parent.lft AND parent.rgtGROUP BY node.nameORDER BY node.lft;+--------------+| name         |+--------------+| level1a      ||  level2a     ||   level3a-2a ||   level3b-2a ||  level2b     ||   level3c-2b ||   level3d-2b |+--------------+

好处是通过lft进行范围(该节点的lft,rgt作为范围)查找就可以,缺点就是增删节点导致很多节点的lft及rgt都要修改

到此,关于“mysql的树形结构存储及查询实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: mysql的树形结构存储及查询实例分析

本文链接: https://lsjlt.com/news/326350.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql的树形结构存储及查询实例分析
    这篇文章主要介绍“mysql的树形结构存储及查询实例分析”,在日常操作中,相信很多人在mysql的树形结构存储及查询实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql的树形结构存储及查询实例分析...
    99+
    2023-06-29
  • 详细聊一聊mysql的树形结构存储以及查询
    目录序存储parent存储pathMPTT(Modified Preorder Tree Traversal)小结doc序 本文主要研究一下mysql的树形结构存储及查询 存储par...
    99+
    2024-04-02
  • 多级树形分类存储结构最佳实践
    ...
    99+
    2016-10-09
    多级树形分类存储结构最佳实践
  • SpringBoot+MyBatisPlus+MySQL8实现树形结构查询
    本文实例为大家分享了SpringBoot+MyBatisPlus+MySQL8实现树形结构查询,供大家参考,具体内容如下 场景: 今天在实现权限功能模块时,需要将查询的权限数据,以树...
    99+
    2024-04-02
  • springboot+mybatis plus实现树形结构查询
    目录背景 使用场景 设计思路 递归模型 实现代码 注意事项 总结 背景 实际开发过程中经常需要查询节点树,根据指定节点获取子节点列表,以下记录了获取节点树的操作,以备不时之需。 使...
    99+
    2024-04-02
  • oracle表中树形结构与分级查询
    1.此处以emp表为例 此表中 empno 字段与 mgr 字段存在 下级与上级关系 2从上往下查 最顶级的boss 此处的level是三大伪列之一 级别select level...
    99+
    2024-04-02
  • Mysql如何通过Adjacency List存储树形结构
    这篇文章主要介绍Mysql如何通过Adjacency List存储树形结构,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如何在数据库中存储树形结构呢?像mysql这样的关系型数据库,...
    99+
    2024-04-02
  • MySQL查询树形结构数据的两种方法
    目录1. 递归查询2. 闭包表对于mysql查询树形结构,可以使用递归查询或者闭包表来实现。以下是两种常用的方法: 1. 递归查询 使用递归查询可以遍历树形结构,获取父节点和子节点的关系。假设有一个名为 your_tab...
    99+
    2023-11-11
    MySQL查询树形数据 MySQL查询树形结构 MySQL树形结构查询
  • mysql递归查询树形结构怎么应用
    在MySQL中实现递归查询树形结构可以使用递归查询语句(Recursive Query Statement)或者使用存储过程来实现。...
    99+
    2023-10-25
    mysql
  • mysql树状查询的示例分析
    这篇文章主要为大家展示了“mysql树状查询的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql树状查询的示例分析”这篇文章吧。--创建表dro&...
    99+
    2024-04-02
  • MySQL如何实现查询树结构
    这篇文章给大家分享的是有关MySQL如何实现查询树结构的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL 查询树结构1. 关于树结构此类结构的数据,通常需要表结构中含有id 、parentId等自关联字段,...
    99+
    2023-06-22
  • springboot+mybatis plus怎么实现树形结构查询
    本篇内容介绍了“springboot+mybatis plus怎么实现树形结构查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录背景使用...
    99+
    2023-06-20
  • MySql优化之体系结构及存储引擎的示例分析
    这篇文章给大家分享的是有关MySql优化之体系结构及存储引擎的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、MySQL结构体系总体上, 我们可以把 MySQL 分成三...
    99+
    2024-04-02
  • sqlserver中怎么实现树形结构递归查询
    本篇文章为大家展示了sqlserver中怎么实现树形结构递归查询,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。公用表表达式(CTE),是一个在查询中定义的临时命名结...
    99+
    2024-04-02
  • 树形结构的菜单表设计与查询
    开发中经常会遇到树形结构的场景,比如:导航菜单、组织机构等等,但凡是有这种父子层级结构的都是如此,一级类目、二级类目、三级类目。。。 对于这种树形结构的表要如何设计呢?接下来一起探讨一下 首先,想一个问题,用非关系型数据库存储可不可以? ...
    99+
    2016-09-24
    树形结构的菜单表设计与查询
  • MySql树形结构(多级菜单)查询设计方案
    背景 又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护 工作中(尤其是传统项目中)经常遇到这种需要,就是树形结构的查询(多级查询),常见的场景有:组织架构(用户部门)查询 和 多级菜单查询 比如,菜单...
    99+
    2023-09-03
    mysql 数据库 java 程序人生 后端
  • MySql树形结构(多级菜单)查询设计方案
    目录背景三级查询(层级固定,层级数少)多级查询(层级不固定/层级很深)遍历整个树:节点搜索(查找出这个节点所在的整个分支)总结背景 又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护 工作中(...
    99+
    2023-03-03
    MySql树形结构查询 MySql树形结构
  • springboot构造树形结构数据并查询的方法
    因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-pl...
    99+
    2024-04-02
  • 大量文件名记录的树形结构存储
    十多年来,NAS中已经存在的目录和文件达到10亿之多,在设计和开发备份系统的过程中碰到了很多挑战,本文将分享大量文件名记录的树形结构存储实践。 一、引言 既然是定期备份,肯定会有1次以上的备份。对于一个特定...
    99+
    2024-04-02
  • Java 递归查询部门树形结构数据的实践
    说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1、数据库表:department 2、编写sql映射语句 &...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作