MySQL递归查找树形结构(这个方法太实用了!)

目录
  • 1、数据库中的树形结构
  • 2、MySQL中如何查找相应的数据
  • 3、准备工作
  • 4.具体的实现(由浅入深)
  • 总结

这两天,遇到了重要节点的需求。这里简单做个总结。

1、数据库中的树形结构

数据库中存贮的数据,以ID和P_ID(父id),来存贮树形结构

这样如果需要查找某个节点的子节点,就可以寻找P_ID。如果要查找所有子节点,就需要遍历所有的子节点的子节点。

如果要判断是否为同级的节点,就可以查找是否有相同的节点。

2、MySQL中如何查找相应的数据

这里,我采用的是一个存储函数。在查询时可以直接使用。当然,为了以后查询方便,也可以在一个视图使用。

3、准备工作

数据库表,为了方便,只有三个字段,能够说明情况即可。

CREATE TABLE `city` (
`i_id`  int(11) NOT NULL AUTO_INCREMENT ,
`p_id`  int(11) NULL DEFAULT NULL ,
`c_name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`i_id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=11
ROW_FORMAT=COMPACT;

随便插入几条数据

实现介绍两个关键的函数

group_concat(column_name): 多条记录合成一条记录

SELECT GROUP_CONCAT(i_id)
FROM city
WHERE p_id='2'

find_in_set(column_name, strlist)在多条记录中查询特定列

SELECT * FROM city
WHERE FIND_IN_SET(p_id,'1,4')

4.具体的实现(由浅入深)

1.只查具体一级下级

SELECT GROUP_CONCAT(i_id) AS ids
FROM city
WHERE p_id=1;

2.查询某一个节点的子节点

在存贮函数之前,要注意一点。虽然参数名是 param_i_id,但查询时 要让p_id=param_i_id

CREATE DEFINER = `root`@`localhost` FUNCTION `getSubNodes`(param_i_id  int)
 RETURNS varchar(100)
BEGIN

#输入I_ID 输出此I_ID下的所有子节点(只有一级)

  DECLARE strSubIds VARCHAR(100);
  DECLARE strPid VARCHAR(100);
  SET strSubIds = '$';
  SET strPid =cast(param_i_id as CHAR);
  SELECT GROUP_CONCAT(i_id) INTO strSubIds FROM city WHERE p_id=strPid;
  RETURN strSubIds;
END;

这样,就可以在查询语句中使用

3.查询所有下级

查到了一级,只要循环查询到某一个节点(这个节点没有子节点),就结束

CREATE DEFINER = `root`@`localhost` FUNCTION `getAllSubNodes`(`param_i_id` int)
 RETURNS varchar(100)
BEGIN

DECLARE strAllSubIds VARCHAR(100);
DECLARE strTempPid VARCHAR(100);

#先得到第一级,也可以掉用getSubNodes(param_i_id);

# SELECT GROUP_CONCAT(i_id) INTO strAllSubIds FROM city WHERE p_id=param_i_id;
 SET strAllSubIds = getSubNodes(param_i_id);
SET strTempPid = strAllSubIds;

#根据 strTempPid 判断是否还有子节点

WHILE strTempPid is not null DO
SELECT group_concat(i_id) INTO strTempPid FROM city WHERE FIND_IN_SET(p_id,strTempPid)>0;

#需要对strTempPid判断,非空用 , 连接

IF (strTempPid is not NULL) THEN
SET strAllSubIds = concat(strAllSubIds,',',strTempPid);

END IF;
END WHILE;
RETURN strAllSubIds;
END;

总结

到此这篇关于MySQL递归查找树形结构的文章就介绍到这了,更多相关MySQL递归查找树形结构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mysql树形递归查询的实现方法

    前言 对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的函数,mysql并没有,所以就只好想自定义函数或者找到替换函数的方法进行改造. Oracle递归查询 oracle实现递归查询的话,就可以使用start with ... connect by connect by递归查询基本语法是: select 1 from 表格 st

  • MySQL递归查找树形结构(这个方法太实用了!)

    目录 1.数据库中的树形结构 2.MySQL中如何查找相应的数据 3.准备工作 4.具体的实现(由浅入深) 总结 这两天,遇到了重要节点的需求.这里简单做个总结. 1.数据库中的树形结构 数据库中存贮的数据,以ID和P_ID(父id),来存贮树形结构 这样如果需要查找某个节点的子节点,就可以寻找P_ID.如果要查找所有子节点,就需要遍历所有的子节点的子节点. 如果要判断是否为同级的节点,就可以查找是否有相同的节点. 2.MySQL中如何查找相应的数据 这里,我采用的是一个存储函数.在查询时可以直

  • 使用递归删除树形结构的所有子节点(java和mysql实现)

    1.业务场景 有如下树形结构: +-0 +-1 +-2 +-4 +-5 +-3 如果删除某个父节点,则其子节点,以及其子节点的子节点,以此类推,需要全部删除. 2.Java实现 使用Map存储树形结构的数据,id为map的key,pid为树形结构的value. import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.uti

  • mysql 递归查找菜单节点的所有子节点的方法

    背景 项目中遇到一个需求,要求查处菜单节点的所有节点,在网上查了一下,大多数的方法用到了存储过程,由于线上环境不能随便添加存储过程, 因此在这里采用类似递归的方法对菜单的所有子节点进行查询. 准备 创建menu表: CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id', `parent_id` int(11) DEFAULT NULL COMMENT '父节点id', `menu_name` varch

  • 详解Java递归实现树形结构的两种方式

    目录 0.引言 1.数据准备 2.类型转化 3.递归实现方法 3.1.Java7及以下纯Java递归实现 3.2.Java8及以上借助lamda表达式实现 0.引言 在开发的过程中,很多业务场景需要一个树形结构的结果集进行前端展示,也可以理解为是一个无限父子结构,常见的有报表指标结构.菜单结构等.Java中递归实现树形结构的两种常见方式如下: Java7及以下纯Java递归实现 Java8及以上借助lamda表达式实现 1.数据准备 Java实体类NodePO对应数据库表 package com

  • Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

  • 一行python实现树形结构的方法

    定义 使用内置的defaultdict 我们可以很容易的定义一个树形数据结构 def tree(): return defaultdict(tree) example: json风格 users = tree() users['harold']['username'] = 'bell' users['handler']['username'] = 'master' 我们可以使用print(json.dumps(users))以json的形式输出,于是我们看到 {'harold': {'usern

  • 使用layui实现树形结构的方法

    树形结构在项目中使用是比较,下面我来介绍一种layui做树形结构的方法 树形结构需要获得的数据有父id,所以数据库需要有父id: 后台代码: @RequestMapping(value = "/lists") public void getList( HttpServletResponse response) { List list = this.companyService.getList(); String[] exclude={"Groups"}; JsonU

  • Java递归遍历树形结构的实现代码

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

  • WinForm实现按名称递归查找控件的方法

    本文所述实例主要实现了WinForm实现按名称递归查找控件的功能,在C#项目开发中有一定的应用价值,分享给大家供大家参考借鉴. 关键代码如下: /// <summary> /// 向下递归查找控件 /// </summary> /// <param name="parentControl">查找控件的父容器控件</param> /// <param name="findCtrlName">查找控件名称<

  • Mysql 实现向上递归查找父节点并返回树结构的示例代码

    通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构.如果只有叶子,剔除掉; 如果只有根,只显示一个秃顶的根 :如果既有叶子又有根则显示叶子与根.如果 传入角色ID 5,15,25,26,则只查找5,15的所有父节点,因为25,26无根节点 需求:通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构

随机推荐