返回顶部
首页 > 资讯 > 数据库 >MySQL查询树结构方式
  • 898
分享到

MySQL查询树结构方式

2024-04-02 19:04:59 898人浏览 安东尼
摘要

目录Mysql 查询树结构1. 关于树结构2. mysql自定义函数的方式2.1 创建测试数据2.2 获取 某节点下所有子节点2.3 获取 某节点的所有父节点3. oracle数据库

MySQL 查询树结构

1. 关于树结构

在这里插入图片描述

此类结构的数据,通常需要表结构中含有id 、parentId等自关联字段,有时为了提高查询效率还可增加更多冗余字段,如index,index的值为所有父级目录的id字符串集合

关于树结构数据的组装,常见的写法是在程序中通过递归的方式去构建出一颗完整的树,单纯通过sql的方式其实并不常用,下面分别给出两种方式的例子。

2. MySQL自定义函数的方式

什么是MySQL自定义函数:聚合函数,日期函数之类的都是MySQL的函数,此处我们定义的函数可同他们一样使用,不过只能在定义的数据库中使用,自定义函数和存储过程类似,不同的是,函数只会返回一个值,不允许返回一个结果集。

2.1 创建测试数据


CREATE TABLE `tree`  (
  `id` bigint(11) NOT NULL,
  `pid` bigint(11) NULL DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `tree` VALUES (1, 0, '中国');
INSERT INTO `tree` VALUES (2, 1, '四川省');
INSERT INTO `tree` VALUES (3, 2, '成都市');
INSERT INTO `tree` VALUES (4, 3, '武侯区');
INSERT INTO `tree` VALUES (5, 4, '红牌楼');
INSERT INTO `tree` VALUES (6, 1, '广东省');
INSERT INTO `tree` VALUES (7, 1, '浙江省');
INSERT INTO `tree` VALUES (8, 6, '广州市');

2.2 获取 某节点下所有子节点


CREATE FUNCTioN `GET_CHILD_node`(rootId varchar(100))   
RETURNS varchar(2000)  
BEGIN   
DECLARE str varchar(2000);  
DECLARE cid varchar(100);   
SET str = '$';   
SET cid = rootId;   
WHILE cid is not null DO   
    SET str = concat(str, ',', cid);   
    SELECT group_concat(id) INTO cid FROM tree where FIND_IN_SET(pid, cid);   
END WHILE;   
RETURN str;   
END

调用自定义函数


select * from tree where FIND_IN_SET(id, GET_CHILD_NODE(2));

在这里插入图片描述

2.3 获取 某节点的所有父节点


CREATE FUNCTION `GET_PARENT_NODE`(rootId varchar(100))   
RETURNS varchar(1000)   
BEGIN   
DECLARE fid varchar(100) default '';   
DECLARE str varchar(1000) default rootId;   
  
WHILE rootId is not null do   
    SET fid =(SELECT pid FROM tree WHERE id = rootId);   
    IF fid is not null THEN   
        SET str = concat(str, ',', fid);   
        SET rootId = fid;   
    ELSE   
        SET rootId = fid;   
    END IF;   
END WHILE;   
return str;  
END

调用自定义函数


select * from tree where FIND_IN_SET(id, GET_PARENT_NODE(5));

在这里插入图片描述

3. Oracle数据库的方式

只需要使用start with connect by prior语句即可完成递归的树查询,详情请自己查阅相关资料。

4. 程序代码递归的方式构建树

这里我就不给出完整代码了,递归的方式很简单,就是先查出所有树节点,然后通过一个TreeNode类中的add方法递归把所有子节点给加进来。核心代码如下:


public class TreeNodeDTO {
    
    private String id;
    private String parentId;
    private String name;
    private List<TreeNodeDTO> children = new ArrayList<>();
    public void add(TreeNodeDTO node) {
        if ("0".equals(node.parentId)) {
            this.children.add(node);
        } else if (node.parentId.equals(this.id)) {
            this.children.add(node);
        } else {
         	//递归调用add()添加子节点
            for (TreeNodeDTO tmp_node : children) {
                tmp_node.add(node);
            }
        }
    }
 }

5. 通过hashMap,只需要遍历一次

就可以完成树的生成:五星推荐


List<TreeNodeDTO> list = dbMapper.getNodeList();
ArrayList<TreeNodeDTO> rootNodes = new ArrayList<>();
Map<Integer, TreeNodeDTO> map = new HashMap<>();
for (TreeNodeDTO node :list) {
    map.put(node.getId(), node);
    Integer parentId = node.getParentId();
    // 判断是否有父节点 (没有父节点本身就是个父菜单)
    if (parentId.equals('0')){
        rootNodes.add(node);
        // 找出不是父级菜单的且集合中包括其父菜单ID
    } else if (map.containsKey(parentId)){
        map.get(parentId).getChildren().add(node);
    }
}

MySQL 查询带树状结构的信息

在Oracle中有函数应用直接能够查询出树状的树状结构信息,例如有下面树状结构的组织成员架构,那么如果我们想查其中一个节点下的所有节点信息

在Oracle中可以直接用下面的语法可以进行直接查询


START WITH CONNECT BY PRIOR

但是在Mysql中是没有这个语法的

而如果你也是想要查询这样的数据结构信息该怎么做呢?我们可以自定义函数。我们将上面的信息初始化信息进数据库中。首先先创建一张表用于存储这些信息,ID为存储自身的ID信息,PARENT_ID存储父ID信息


CREATE TABLE `company_inf` (
  `ID` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `NAME` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `PARENT_ID` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL
)

然后将图中的信息初始化表中


INSERT INTO company_inf VALUES ('1','总经理王大麻子','1');
INSERT INTO company_inf VALUES ('2','研发部经理刘大瘸子','1');
INSERT INTO company_inf VALUES ('3','销售部经理马二愣子','1');
INSERT INTO company_inf VALUES ('4','财务部经理赵三驼子','1');
INSERT INTO company_inf VALUES ('5','秘书员工J','1');
INSERT INTO company_inf VALUES ('6','研发一组组长吴大棒槌','2');
INSERT INTO company_inf VALUES ('7','研发二组组长郑老六','2');
INSERT INTO company_inf VALUES ('8','销售人员G','3');
INSERT INTO company_inf VALUES ('9','销售人员H','3');
INSERT INTO company_inf VALUES ('10','财务人员I','4');
INSERT INTO company_inf VALUES ('11','开发人员A','6');
INSERT INTO company_inf VALUES ('12','开发人员B','6');
INSERT INTO company_inf VALUES ('13','开发人员C','6');
INSERT INTO company_inf VALUES ('14','开发人员D','7');
INSERT INTO company_inf VALUES ('15','开发人员E','7');
INSERT INTO company_inf VALUES ('16','开发人员F','7');

例如我们想要查询研发部门经理刘大瘸子下的所有员工,在Oracle中我们可以这样写


  SELECT *
  FROM T_PORTAL_AUTHORITY
  START WITH ID='1'
  CONNECT BY PRIOR ID = PARENT_ID

而在Mysql中我们需要下面这样自定义函数


CREATE FUNCTION getChild(parentId VARCHAR(1000))
RETURNS VARCHAR(1000)
BEGIN
    DECLARE oTemp VARCHAR(1000);
    DECLARE oTempChild VARCHAR(1000);
    SET oTemp = '';
    SET oTempChild =parentId;
    WHILE oTempChild is not null DO
        IF oTemp != '' THEN
            SET oTemp = concat(oTemp,',',oTempChild);
        ELSE
            SET oTemp = oTempChild;
        END IF;
        SELECT group_concat(ID) INTO oTempChild FROM company_inf where parentId<>ID and FIND_IN_SET(parent_id,oTempChild)>0;
    END WHILE;
RETURN oTemp;
END

然后这样查询即可


SELECT * FROM company_inf WHERE FIND_IN_SET(ID,getChild('2'));

此时查看查询出来的信息就是刘大瘸子下所有的员工信息了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL查询树结构方式

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

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

猜你喜欢
  • MySQL查询树结构方式
    目录MySQL 查询树结构1. 关于树结构2. MySQL自定义函数的方式2.1 创建测试数据2.2 获取 某节点下所有子节点2.3 获取 某节点的所有父节点3. Oracle数据库...
    99+
    2024-04-02
  • MySQL-树型结构数据查询
    建表 SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure f...
    99+
    2023-09-03
    mysql 数据库 sql
  • 树形结构查询
    提示:以下内容仅供参开 文章目录 前言一、需求场景二、数据库表三.实现方式1.方式1:2.方式2: 总结 前言 提示: 提示:以下是本篇文章正文内容,下面案例可供参考 一、需...
    99+
    2023-09-05
    mybatis java mysql
  • MySQL如何实现查询树结构
    这篇文章给大家分享的是有关MySQL如何实现查询树结构的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL 查询树结构1. 关于树结构此类结构的数据,通常需要表结构中含有id 、parentId等自关联字段,...
    99+
    2023-06-22
  • MySQL树状结构表查询通解
    文章目录 前言一、数据准备二、代码实现三、案例使用1. 建立数据表实体类2. mapper文件3. 使用 四、总结 前言 ​ 最近做了一个中医药方面的项目,该项目分为游戏端和服务端。笔者负责的是服务端的开发。在服务端的业务中...
    99+
    2023-08-19
    mysql 数据库 java 数据结构
  • MySQL查询树形结构数据的两种方法
    目录1. 递归查询2. 闭包表对于mysql查询树形结构,可以使用递归查询或者闭包表来实现。以下是两种常用的方法: 1. 递归查询 使用递归查询可以遍历树形结构,获取父节点和子节点的关系。假设有一个名为 your_tab...
    99+
    2023-11-11
    MySQL查询树形数据 MySQL查询树形结构 MySQL树形结构查询
  • MySql树形结构(多级菜单)查询设计方案
    背景 又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护 工作中(尤其是传统项目中)经常遇到这种需要,就是树形结构的查询(多级查询),常见的场景有:组织架构(用户部门)查询 和 多级菜单查询 比如,菜单...
    99+
    2023-09-03
    mysql 数据库 java 程序人生 后端
  • MySql树形结构(多级菜单)查询设计方案
    目录背景三级查询(层级固定,层级数少)多级查询(层级不固定/层级很深)遍历整个树:节点搜索(查找出这个节点所在的整个分支)总结背景 又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护 工作中(...
    99+
    2023-03-03
    MySql树形结构查询 MySql树形结构
  • mysql递归查询树形结构怎么应用
    在MySQL中实现递归查询树形结构可以使用递归查询语句(Recursive Query Statement)或者使用存储过程来实现。...
    99+
    2023-10-25
    mysql
  • springboot构造树形结构数据并查询的方法
    因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-pl...
    99+
    2024-04-02
  • 一文解析ORACLE树结构查询
    我们在日常程序设计中,经常会遇到树状结构的表示,例如组织机构、行政区划等等。这些在数据库中往往通过一张表进行展示。这里我们以一张简单的行政区划表为例进行展示,在实际使用过程中,可以为其添加其他描述字段以及层级。 表中通...
    99+
    2024-04-02
  • SQL Server 通过with as方法查询树型结构
    一、with as 公用表表达式   类似VIEW,但是不并没有创建对象,WITH AS 公用表表达式不创建对象,只能被后随的SELECT语句,其作用:   1. 实现递归查询(树形结构)   2....
    99+
    2024-04-02
  • SpringBoot+MyBatisPlus+MySQL8实现树形结构查询
    本文实例为大家分享了SpringBoot+MyBatisPlus+MySQL8实现树形结构查询,供大家参考,具体内容如下 场景: 今天在实现权限功能模块时,需要将查询的权限数据,以树...
    99+
    2024-04-02
  • springboot+mybatis plus实现树形结构查询
    目录背景 使用场景 设计思路 递归模型 实现代码 注意事项 总结 背景 实际开发过程中经常需要查询节点树,根据指定节点获取子节点列表,以下记录了获取节点树的操作,以备不时之需。 使...
    99+
    2024-04-02
  • mysql的树形结构存储及查询实例分析
    这篇文章主要介绍“mysql的树形结构存储及查询实例分析”,在日常操作中,相信很多人在mysql的树形结构存储及查询实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql的树形结构存储及查询实例分析...
    99+
    2023-06-29
  • oracle表中树形结构与分级查询
    1.此处以emp表为例 此表中 empno 字段与 mgr 字段存在 下级与上级关系 2从上往下查 最顶级的boss 此处的level是三大伪列之一 级别select level...
    99+
    2024-04-02
  • springboot构造树形结构数据并查询的方法是什么
    本篇内容主要讲解“springboot构造树形结构数据并查询的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot构造树形结构数据并查询的方法是什么”吧!因为项目需要,页...
    99+
    2023-06-25
  • mysql如何查询表结构
    本篇内容主要讲解“mysql如何查询表结构”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql如何查询表结构”吧! mysql查...
    99+
    2024-04-02
  • SQL Server如何通过with as方法查询树型结构
    SQL Server如何通过with as方法查询树型结构,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、with as 公用表表达式 ...
    99+
    2024-04-02
  • 详细聊一聊mysql的树形结构存储以及查询
    目录序存储parent存储pathMPTT(Modified Preorder Tree Traversal)小结doc序 本文主要研究一下mysql的树形结构存储及查询 存储par...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作