我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL如何实现查询树结构

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL如何实现查询树结构

这篇文章给大家分享的是有关MySQL如何实现查询树结构的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

MySQL 查询树结构

1. 关于树结构

MySQL如何实现查询树结构

此类结构的数据,通常需要表结构中含有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));

MySQL如何实现查询树结构

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));

MySQL如何实现查询树结构

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'));

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

感谢各位的阅读!关于“MySQL如何实现查询树结构”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL如何实现查询树结构

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL如何实现查询树结构

这篇文章给大家分享的是有关MySQL如何实现查询树结构的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL 查询树结构1. 关于树结构此类结构的数据,通常需要表结构中含有id 、parentId等自关联字段,
2023-06-22

如何使用SpringBoot+MyBatisPlus+MySQL8实现树形结构查询

这篇文章主要为大家展示了“如何使用SpringBoot+MyBatisPlus+MySQL8实现树形结构查询”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用SpringBoot+MyBat
2023-06-15

MySQL树状结构表查询通解

文章目录 前言一、数据准备二、代码实现三、案例使用1. 建立数据表实体类2. mapper文件3. 使用 四、总结 前言 ​ 最近做了一个中医药方面的项目,该项目分为游戏端和服务端。笔者负责的是服务端的开发。在服务端的业务中
2023-08-19

springboot+mybatis plus怎么实现树形结构查询

本篇内容介绍了“springboot+mybatis plus怎么实现树形结构查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录背景使用
2023-06-20

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

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

mysql递归查询树形结构怎么应用

在MySQL中实现递归查询树形结构可以使用递归查询语句(Recursive Query Statement)或者使用存储过程来实现。使用递归查询语句:递归查询语句使用了WITH RECURSIVE子句,可以在语句中递归引用自身。以下是一个使
2023-10-25

纯css如何实现树形结构

这篇文章将为大家详细讲解有关纯css如何实现树形结构,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。纯css实现属性结构css实现属性结构的思路是利用伪类实现树形结构连接线,如果想实现点击展开和收缩以及复选
2023-06-08

MySQL查询树形结构数据的两种方法

目录1. 递归查询2. 闭包表对于mysql查android询树形结构,可以使用递归查询或者闭包表来实现。以下是两种常用的方法:1. 递归查询使用递归查询可以遍历树形结构,获取父节点和子节点的关系。假设有一个名为 your_table
MySQL查询树形结构数据的两种方法
2023-11-11

vue如何实现树形结构表格

这篇文章主要讲解了“vue如何实现树形结构表格”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue如何实现树形结构表格”吧!在el-table中,支持树类型的数据的显示。当 row 中包含
2023-07-04

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

目录背景三级查询(层级固定,层级数少)多级查询(层级不固定/层级很深)遍历整个树:节点搜索(查找出这个节点所在的整个分支)总结背景又android很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护工作中(尤其是
2023-03-03

编程热搜

目录