`

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通过自定义函数实现递归查询父级ID或者子级ID

    主要介绍了MySQL通过自定义函数实现递归查询父级ID或者子级ID,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

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

    对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例183 自定义非泛型栈结构 233 实例184 使用泛型实现栈结构 234 实例185 自定义泛型化数组类 235 实例186 泛型方法与数据查询 236 实例187 泛型化方法与最小值 238 实例188 泛型化接口与最大值 239 实例189 使用...

    易语言程序免安装版下载

    修改扩展界面支持库一,为“树形框”增加多态检查框功能,相应地添加了多个与检查框相关的属性、方法和事件。 17. 修改高级表格支持库,允许“复制选定文本()”“剪切选定文本()”在“允许选择块”属性为假时复制...

    JAVA上百实例源码以及开源项目源代码

    1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实世界...

    java源码包---java 源码 大量 实例

    1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实世界...

    java源码包2

    1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实...

    java源码包3

    1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实...

    java源码包4

    1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    JAVA上百实例源码以及开源项目

    1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型  基于EJB的真实世界...

Global site tag (gtag.js) - Google Analytics