`

mysql自定义函数获取树形结构数据

阅读更多

在实际业务中,我们经常会遇到树形的机构数据,如行政区划、栏目分类等。

数据库表的设计机构大致如下:

    

CREATE TABLE `ri_sys_cat` (
  `cat_id` varchar(64) NOT NULL COMMENT 'ID',
  `cat_kind` varchar(4) DEFAULT NULL COMMENT '行业分类类型',
  `cat_code` varchar(10) DEFAULT NULL COMMENT '行业分类代码',
  `cat_name` varchar(100) NOT NULL COMMENT '分类名称',
  `parent_id` varchar(64) NOT NULL COMMENT '父类ID',
  PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='公共行业分类表';

 

 

    实际读取表数据的时候,要么在java端进行处理,要么写相应的mysql函数或者存储过程,进行处理。

 

    java处理举例如下:

 

//定义相应的树形机构类
public class SysCatTree implements java.io.Serializable{
    
    private static final long serialVersionUID = 3118551510633166045L;
    
    /** 分类ID*/
    private String catId;
    /** 分类ID -catId别名*/
    private String id;
    
    /** 01-国民经济行业分类*/
    private String catKind;
    
    /** 分类名称*/
    private String catName;
    /** 分类名称 -catName别名*/
    private String label;
    
    /** 父类ID*/
    private String parentId;
   
    /** 行业编码*/
    private String catCode;
    /** 子类*/
    private List<SysCatTree> children;
	
    public void setCatId(String catId) {
        this.catId = catId;
        this.id = catId;
    }
    
    public String getCatName() {
        return catName;
    }
    public void setCatName(String catName) {
        this.catName = catName;
        this.label = catName;
    }
    //...省略get/set方法

}

   获取相应的数据库数据,并将list转为树形结构,代码如下

 

 

private static List<SysCatTree> createTree(List<SysCatTree> menuList, String parentId) {  
        List<SysCatTree> childMenu = new ArrayList<>();
        for (SysCatTree catTree : menuList) {
            if (parentId.equals(catTree.getParentId())) { 
                List<SysCatTree> c_node = createTree(menuList, catTree.getId());  
                catTree.setChildren(c_node);
                childMenu.add(catTree);  
            }  
        }  
        return childMenu;  
 }  

   在我们的业务中,数据库表中存储的是树形编码code,而不是树形id,这时就需要根据编码code,查询其下面的所有子类编码,进行相应的数据查询等。为了满足这一需求,需要在数据库中,自定义函数。

 

   自定义的mysql函数如下

 

DROP FUNCTION IF EXISTS queryChildSysCatByCode;

CREATE FUNCTION `queryChildSysCatByCode`(catKind VARCHAR(4),catcode VARCHAR(10)) RETURNS varchar(2000) CHARSET utf8
    COMMENT '根据分类编码查询该编码下的子类编码树'
BEGIN

-- 定义局部变量
DECLARE sTempId VARCHAR(2000);
DECLARE sTempCode VARCHAR(500);
DECLARE sTempChildCode VARCHAR(2000);

-- 给sTempId赋初始值
select cat_id into sTempId from ri_sys_cat where cat_code = catcode;
-- 循环获取
WHILE sTempId IS NOT NULL DO
	select GROUP_CONCAT(cat_id),GROUP_CONCAT(cat_code) into sTempId,sTempCode from ri_sys_cat where cat_kind = catKind and  FIND_IN_SET(parent_id,sTempId)>0;

	IF sTempChildCode IS NULL AND sTempCode IS NOT NULL
		THEN set sTempChildCode = sTempCode;
	ELSEIF sTempChildCode	IS NOT NULL AND sTempCode IS NOT NULL
		THEN set sTempChildCode = CONCAT(sTempChildCode,',',sTempCode);
	END IF;
END WHILE;

return sTempChildCode;

 

 

   调用如下

    

select queryChildSysCatByCode('04','RS01');

   

   返回结果如下:

   

RS0101,RS0102,RS0103,RS0104,RS0101001,RS0101002,RS0101003,RS0101004,RS0101005,RS0101006,RS0101007,RS0102001,RS0102002,RS0102003,RS0102004,RS010301,RS010302,RS010303

 

   

 

 

分享到:
评论

相关推荐

    MySql 中查询树形结构的全部子项列表 Function

    在MySQL数据库中,处理树形结构的数据是一项常见的任务,特别是在...总之,通过自定义函数和递归查询,我们可以在MySQL中有效地查询树形结构的全部子项列表。在处理复杂的树形数据时,理解并掌握这种技术是非常重要的。

    ztree树形结构+mysql完整

    本项目"ztree树形结构+mysql完整"结合了ZTree的功能与MySQL数据库的使用,提供了一个完整的解决方案,包括数据存储、查询以及前端交互。 首先,ZTree的核心特性在于其丰富的API和可定制性。它支持动态加载、节点...

    MySQL通过自定义函数实现递归查询父级ID或者子级ID

    在MySQL中,递归查询通常用于处理层次结构的数据,如组织结构、菜单系统或类别树等。当数据的层级关系无法预知或者可能无限深时,传统的JOIN操作可能无法满足需求,此时就需要自定义函数来实现递归查询。本文将详细...

    通过数据库管理树形框结构数据源码

    2. 数据库查询:为了从数据库中获取数据并构建树形结构,需要执行SQL查询或其他特定于数据库的语言。这些查询可能涉及SELECT语句,用于检索特定的数据行,并可能包括JOIN操作来连接多个表。 3. 数据绑定:将数据库...

    zTree后台组装树结构java代码

    在IT行业中,构建树形结构的数据展示是一种常见的需求,特别是在前端UI设计中。zTree是一款流行的JavaScript插件,专门用于创建交互式的树形菜单或树状视图。本主题聚焦于如何在Java后端组装zTree所需的树结构,并与...

    sql_函数实现三种父子递归

    在SQL中,递归函数是处理层次结构数据的有效方法,特别是在构建树形结构如菜单树或权限树时。本文将探讨如何使用SQL函数实现三种常见的递归查询:找到所有子节点、查找所有父节点以及面包屑导航数据。我们将通过一个...

    MySQL实现树状所有子节点查询的方法

    在MySQL中,实现树状所有子节点的查询并非像Oracle那样可以直接使用Hierarchical Queries和`CONNECT BY`语句。然而,尽管MySQL不直接支持这样的...根据实际情况和性能需求,可以选择合适的方法来实现树形结构的查询。

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

    在数据库管理中,树形...总的来说,尽管MySQL没有内置的递归查询功能,但通过自定义函数和适当的设计,仍然可以有效地处理树形结构数据的查询。理解这些技术可以帮助我们在MySQL环境中优雅地处理复杂的层次数据问题。

    MySQL递归查询树状表的子节点、父节点具体实现

    这里介绍的解决方案是通过创建两个自定义函数——`getChildList`和`getParentList`——来实现递归查询。这两个函数都是基于WHILE循环和`GROUP_CONCAT`聚合函数来工作的。 1. `getChildList`函数: 这个函数用于获取...

    mysql递归查询.doc

    MySQL 递归查询是指在 MySQL 数据库中使用递归函数来实现树形结构数据的查询,例如部门表中某个部门的所有下属部分或者某个部分的所有上级部门。 在 MySQL 中实现递归查询需要使用自定义函数(Stored Function),...

    通过获取数据库信息动态生成树

    4. **动态渲染**:当从数据库获取数据后,使用选定的树形控件将数据渲染成树。这通常涉及到数据与UI组件的双向绑定,数据变化时,树结构自动更新。可以使用事件监听来响应数据的改变,比如监听数据库的实时更新。 5...

    php基础知识树形图

    本文将围绕“PHP基础知识树形图”展开,深入探讨PHP的核心概念、语法、数据类型、控制结构、函数、数组、类与对象、错误与异常处理以及文件操作等关键知识点。 1. **PHP基础概念** - PHP是嵌入在HTML中的,用于...

    jsp树形菜单

    本项目利用JavaServer Pages (JSP) 技术,结合MySQL数据库来创建一个可自定义的树形菜单,而且其代码设计灵活,可以方便地切换到其他数据库系统,如SQL Server。 首先,我们需要了解JSP的基础。JSP是Java的一种动态...

    db2迁移到mysql.docx

    在DB2中,树形结构的查询可能使用特定的函数或存储过程。在MySQL中,可以通过递归查询或者使用自定义函数来实现类似的功能。 ##### 5.1. 根据传入ID查询所有父节点的ID ```sql SELECT * FROM treenodes WHERE FIND_...

    里面有mysql基本操作,自定义jsp标签,XML的解析

    - **DOM(Document Object Model)**:将整个XML文档加载到内存中并构建一个树形结构,允许随机访问文档中的任何部分。 - **SAX(Simple API for XML)**:逐行解析XML文档,适用于大型文件,因为不需要一次性将整个...

    jsp mysql 开发的

    7. **树形结构和下拉列表**:`tree_array`和`html_array`用于生成树形结构和下拉列表的SQL和HTML代码。这通常涉及额外的数据库查询,以获取下拉选项或树结构的层次数据。 8. **事件处理**:JavaScript代码中的`...

Global site tag (gtag.js) - Google Analytics