日常开发中我们经常会遇到树形结构数据处理,一般表结构通常会常用id,pid这种设计方案。

之前用oracle、sqlServer数据库,用相应的语法即可获取树形结构数据(oracel:connect by prior ;sqlServer:with...as ...)。

最近一个项目数据库用的是mysql,需求中含有获取树形结构数据的接口,由于之前没怎么用过mysql,于是第一时间就是查看mysql语法,看看有没有类似于oracle或sqlserver的递归语法,结果是没有,后来决定自定义数据库函数(暂时解决了需求)。

1.自定义递归函数

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Function structure for `getPartyChildOrg`
-- ----------------------------
DROP FUNCTION IF EXISTS `getPartyChildOrg`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `getPartyChildOrg`(orgid BIGINT) RETURNS varchar(4000) CHARSET utf8
BEGIN
DECLARE oTemp VARCHAR(4000);
DECLARE oTempChild VARCHAR(4000); SET oTemp = '';
SET oTempChild = CAST(orgid AS CHAR); WHILE oTempChild IS NOT NULL
DO
SET oTemp = CONCAT(oTemp,',',oTempChild);
SELECT GROUP_CONCAT(id) INTO oTempChild FROM sub_party_orginfo WHERE logic_delete = 0 and FIND_IN_SET(pid,oTempChild) > 0;
END WHILE;
RETURN oTemp;
END
;;
DELIMITER ;

  暂时满足了需求,后期数据量大了,再加上主键生成策略生成的主键长度比较长,函数返回结果长度受VARCHAR最大长度限制,该方案会失效,导致查询的数据不全。

2.自定义存储过程,将查询的结果存放到临时表中。

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Procedure structure for `findPartyOrgChildList`
-- ----------------------------
DROP PROCEDURE IF EXISTS `findPartyOrgChildList`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `findPartyOrgChildList`(IN pid VARCHAR(20))
BEGIN
DECLARE v_org BIGINT(20);
DECLARE done INTEGER DEFAULT 0;
-- 查询结果放入游标中
DECLARE C_org CURSOR FOR SELECT d.id
FROM sub_party_orginfo d
WHERE d.pid = pid;
DECLARE CONTINUE HANDLER FOR NOT found SET done=1;
SET @@max_sp_recursion_depth = 10; -- 传入的组织id写入临时表
INSERT INTO temp_party_org VALUES (pid);
OPEN C_org;
FETCH C_org INTO v_org;
WHILE (done=0)
DO
-- 递归调用,查找下级
CALL findPartyOrgChildList(v_org);
FETCH C_org INTO v_org;
END WHILE;
CLOSE C_org;
END
;;
DELIMITER ; -- ----------------------------
-- Procedure structure for `findPartyOrgList`
-- ----------------------------
DROP PROCEDURE IF EXISTS `findPartyOrgList`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `findPartyOrgList`(IN pid BIGINT(20))
BEGIN
DROP TEMPORARY TABLE IF EXISTS temp_party_org;
-- 创建临时表
CREATE TEMPORARY TABLE temp_party_org(id BIGINT(20));
-- 清空临时表数据
DELETE FROM temp_party_org;
-- 发起调用
CALL findPartyOrgChildList(pid); END
;;
DELIMITER ;

  

mysql 树结构递归处理的更多相关文章

  1. mysql+mybatis递归调用

    递归调用的应用场景常常出现在多级嵌套的情况,比如树形的菜单.下面通过一个简单的例子来实现mysql+mybatis的递归. 数据模型 private Integer categoryId; priva ...

  2. mysql中递归树状结构<转>

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

  3. mysql类似递归的一种操作进行层级查询

    select device_id,device_type,COUNT(1) count from ( select t1.device_id,t1.device_type,DATE_SUB(t1.re ...

  4. mysql向上递归&向下递归

    工作记录 向上递归函数test: BEGIN ); ); SET sTemp = '$'; SET sTempChd =cast(rid as CHAR); WHILE sTempChd is not ...

  5. sqlserver 树结构递归(向上递归和向下递归)

    --获取当前及以下部门 Create proc GetCurrentAndUnderOrg @orgId int as begin WITH cte AS ( SELECT * ,0 AS level ...

  6. mysql的递归(使用函数)

    getChildList: BEGIN #声明两个局部变量 ); ); #初始化局部变量 SET sTemp = ''; #调用cast函数将int转换为char SET sTempChd = roo ...

  7. JAVA实现查询栏目、类别(菜单)返回树结构(递归)

    其中Channel.java是栏目结构,ChannelDto是我自己封装的返回给前端的数据,可以根据自己的来 这个的逻辑就是双重循环遍历每个类别,然后判断如果当前类别是其他类别的父级,那么就把其他类别 ...

  8. list转换为树结构--递归

    public static JSONArray treeMenuList(List<Map<String, Object>> menuList, Object parentId ...

  9. 递归的实际业务场景之MySQL 递归查询

    喜欢就点个赞呗! 源码<--请点击此处查看 引入 当我看到一些评论时,例如下面的样子.我挺好奇这个功能是怎么样做出来的.进过查阅资料,发现这其实是 MySQL 的递归操作.下面就让我操作一下怎么 ...

随机推荐

  1. C++ 中virtual 用法

    一.virtual 修饰基类中的函数,派生类重写该函数: #include using namespace std; class A{ public: virtual void display(){ ...

  2. Java打印素数(质数)

    要求:打印 2 - 100000 当中的素数与非素数.(素数定义:在大于1的自然数中,除了1和它本身以外不再有其他因数) 1. 常规方式——对正整数n,如果用2到  之间的所有整数去除,均无法整除,则 ...

  3. Oralce JDBC jar包下载

    下载地址:https://pan.baidu.com/s/1sU7gu4biigEAw-3Bu7yIOA 下载包中包括以下文件: ojdbc5.jarojdbc5dms.jarojdbc5dms_g. ...

  4. ISO/IEC 9899:2011 条款6.2.2——标识符的连接

    6.2.2 标识符的连接 1.在不同作用域中声明的一个标识符或在同一作用域多次出现的一个标识符可以被用作对同一个对象或函数的引用,通过一个称为连接的过程.[注:在两个不同的标识符之间没有连接.]有三种 ...

  5. springboot 之JPA

    1.添加pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  6. osg 在fbx模型中添加自定义节点

  7. 21Flutter Drawer侧边栏、以及侧边栏内容布局

    Tabs.dart import 'package:flutter/material.dart'; import 'tabs/Home.dart'; import 'tabs/Category.dar ...

  8. webpack——Modules && Hot Module Replacement

    blog:JavaScript Module Systems Showdown: CommonJS vs AMD vs ES2015 官网链接: Modules 官网链接:Hot Module Rep ...

  9. 最简单的freemarker用法实例

          1.下载freemarker-2.3.19.jar到web项目的lib下. 2.新建freemarker引擎协助类 package com.bxsurvey.sys.process.uti ...

  10. QML渐变色

    Rectangle { id: tab_btn width: height: parent.height color: "black" gradient: Gradient { G ...