层级的业务数据在系统中很常见,如组织机构、商品品类等。

如果要获取层级数据的全路径,除了缓存起来,就是递归访问的方式了:

  1. 将层级数据缓存在redis中,用redis递归获取层级结构。此方法效率高。
  2. 在MySQL中做递归遍历,(Oracle有递归的语法支持,而MySQL并没有),需要自己写函数去递归。此方法效率低。

程序运行基于效率要求,一般使用Redis去递归。本次,因为初始化数据需要,写了一份MySQL函数去递归:

/* 根据ID获取级联编码路径 */
CREATE FUNCTION `f_org_recursion`(
v_id INTEGER
) RETURNS VARCHAR(1024)
BEGIN
/* 编码 */
DECLARE v_code VARCHAR(1024);
/* 编码路径 */
DECLARE v_cascade_code VARCHAR(1024);
/* 父节点ID */
DECLARE v_parent_id INT;
/* 递归操作的层次 */
DECLARE v_recursion_level INT; SET v_cascade_code = '';
SET v_recursion_level = 0; /* 查询本节点代码、和父节点ID */
SELECT t.code, t.parent_id INTO v_code, v_parent_id FROM t_organ t WHERE t.id = v_id; /* 是否为空 */
IF v_code IS NULL THEN
RETURN CONCAT('no record for id ', v_id);
ELSE
SET v_cascade_code = CONCAT('', v_code);
END IF; /* 递归拼接代码 */
WHILE v_parent_id IS NOT NULL DO
/* 递归层次限制,避免死循环 */
SET v_recursion_level = v_recursion_level + 1;
IF v_recursion_level > 20 THEN
RETURN 'Recursion out of 20 times';
END IF; /* 以父ID为ID查询 */
SELECT t.code, t.parent_id INTO v_code, v_parent_id FROM t_organ t WHERE t.id = v_parent_id; /* 是否为空 */
IF v_code IS NULL THEN
RETURN CONCAT('no record for parent id ', v_parent_id);
ELSE
SET v_cascade_code = CONCAT(v_code, '-', v_cascade_code);
END IF; END WHILE; RETURN v_cascade_code;
END

【MySQL】MySQL层级数据的递归遍历的更多相关文章

  1. iOS:二叉树多级表格的使用,使用三方库TreeTableView-master实现对json解析数据的递归遍历整理成树状结构

    在项目中,我们有时需要使用二叉树来实现多级表格的递归遍历查询,如果对二叉树比较懂,那么写起来其实也不费事,为了节省开发时间,下面介绍一下第三方库TreeTableView-master,这个三方库上给 ...

  2. MySql无限分类数据结构--预排序遍历树算法

    MySql无限分类数据结构--预排序遍历树算法 无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多. 我们最常见最简单的方法就是在MySql里ID ,parentID, ...

  3. 使用python将mysql数据库的数据转换为json数据

    由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问M ...

  4. 用python批量向数据库(MySQL)中导入数据

    用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同 Current database: pyt ...

  5. 读取mysql数据库的数据,转为json格式

    # coding=utf-8 ''' Created on 2016-10-26 @author: Jennifer Project:读取mysql数据库的数据,转为json格式 ''' import ...

  6. php查询mysql返回大量数据结果集导致内存溢出的解决方法

    web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...

  7. 将从mysql数据库查询的信息,遍历到List<>以及一些随机数的生成

    将从mysql数据库查询的信息,遍历到List<>以及一些随机数的生成. 代码比较乱,但是方法还是对的,大家又需要的选择看,希望对博友 有帮助,欢迎留言分享! public class s ...

  8. 用canal监控binlog并实现mysql定制同步数据的功能

    业务背景 写任何工具都不能脱离实际业务的背景.开始这个项目的时候是因为现有的项目中数据分布太零碎,零零散散的分布在好几个数据库中,没有统一的数据库来收集这些数据.这种情况下想做一个大而全的会员中心系统 ...

  9. 【Redis 向Redis中批量导入mysql中的数据(亲自测试)】

    转自:https://blog.csdn.net/kenianni/article/details/84910638 有改动,仅供个人学习 问题提出:缓存的冷启动问题 应用系统新版本上线,这时候 re ...

随机推荐

  1. QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录

    ---------------------------------目录------------------------------------- QQ登录整合/oauth2.0认证-03-对第二节的代 ...

  2. (原+转)Ubuntu16.04软件中心闪退及wifi消失

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6321889.html 参考网址: http://blog.csdn.net/felcon/articl ...

  3. 【LeetCode】206. Reverse Linked List (2 solutions)

    Reverse Linked List Reverse a singly linked list. click to show more hints. Hint: A linked list can ...

  4. strace命令解析

    strace常用于跟踪和分析进程执行时中系统调用和耗时以及占用cpu的比例,常用的格式如下: 1.sudo /usr/bin/strace -Ttt -p pid 2>pid.log 跟进pid ...

  5. 保证java的jar包在后台运行

    nohup  java -jar XX.jar >temp.text &

  6. Jquery 数组操作(转)

    在jquery中处理JSON数组的情况中遍历用到的比较多,但是用添加移除这些好像不是太多. 今天试过json[i].remove(),json.remove(i)之后都不行,看网页的DOM对象中好像J ...

  7. java 发送post请求参数中含有+会转化为空格的问题

    如题 原因分析:参数在传递过程中经历的几次编码和解码标准不同,导致加号.空格等字符的错误. 解决方案:将post请求的参数中 ,含有+号的,统统采用%2B 去替换,这是URL的协议问题.

  8. <welcome-file>index.action</welcome-file>直接设置action,404和struts2中的解决方案

    这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file> ...

  9. 搭建自己的 github.io 博客

    1.前言 github.io 是基于 Github 的 repo 管理,这意味着咱们对其是有绝对的控制,这个跟放在第三方的平台比,可控性要好太多. 使用 github pages 服务搭建博客的好处有 ...

  10. 子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明

    昨天, 群里面有一个人问起: 要怎么让"文件打开对话框"居中显示, 有人说子类. 而我告诉他的方法是用钩子函数OFNHookProc, 不知道这是不是所谓的子类?相信看了我今天这篇 ...