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

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

  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. 【linux环境】Linux环境 php连接oracle11g数据库(相关插件已备份至U盘)

    1.环境:centos6 . LNMP(linux环境都可以,跟服务器没啥大关系) 2.前期准备:弄清楚 项目php的运行目录,php.ini的配置目录,php-config的运行目录 3.安装先知: ...

  2. 【table】给table表格设置一个通用的css3样式(默认有斑马条纹)

    /* = 表格(默认有斑马条纹) ------------------------------------------ */ .data-table { margin: 10px 0; } .data ...

  3. Easyui入门视频教程 第03集---Easyui布局

    Easyui入门视频教程 第03集---Easyui布局 目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义   Easyui入门视频教 ...

  4. CSRF攻击与防御(写得非常好)

    转自:http://blog.csdn.net/stpeace/article/details/53512283 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forge ...

  5. C++的iostream标准库介绍+使用详解(转)

    0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是 ...

  6. PHP通过soap调用c#的WebService

    1:C# Contact public class Contact { private int _Id; private string _Name; public int id { get { ret ...

  7. 富文本编辑器 CKeditor 配置使用

    作者:Tyler Ning出处:http://www.cnblogs.com/tylerdonet/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...

  8. 【ASP.NET】ASP.NET如何发布Web项目

    1.右击需要发布的项目,选择 属性>应用程序 在目标框架中选择.NET的版本,选择的版本的要本机安装的版本相符合,通常可以在“C:\Windows\Microsoft.NET\Framework ...

  9. linux 下 pip 安装教程

    方法一: 下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 这就 ...

  10. log4j(五)——如何控制不同目的地的日志输出?

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 import org.apache.log4j.*; import java.io ...