当前位置: 首页 > news >正文

MySQL自定义函数递归查询父节点和子节点

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

#说明:area_id表示当前节点,are_area_id表示父节点

#mysql向下递归查询子节点
CREATE FUNCTION getChildListById(id varchar(32))   
    RETURNS varchar(4000)  
    BEGIN  
        DECLARE str varchar(4000);  
        DECLARE cid varchar(4000);   
        DECLARE area_id_str varchar(8000);
        select area_id into cid from area where area_id = id;
        #GROUP_CONCAT将某一字段的值按指定的字符进行累加,系统默认的分隔符是逗号,默认可以累加的字符长度为1024字节
        SET GLOBAL group_concat_max_len=102400;
        SET SESSION group_concat_max_len=102400;
        SET str = '';     
        SET area_id_str = null;
        WHILE cid is not null DO   
                SET str = concat(str, ',', cid);   
                SELECT group_concat(area_id) INTO cid FROM area where FIND_IN_SET(are_area_id, cid) > 0;   
        END WHILE; 
        select group_concat(area_id) into area_id_str from area where find_in_set(area_id, str);
        RETURN area_id_str;   
    END;

#mysql向上递归查询子节点
CREATE FUNCTION getParentListById(id varchar(32))   
    RETURNS varchar(4000)  
    BEGIN  
        DECLARE str varchar(4000);  
        DECLARE cid varchar(4000);   
        DECLARE area_id_str varchar(8000);
        select area_id into cid from area where area_id = id;
        #GROUP_CONCAT将某一字段的值按指定的字符进行累加,系统默认的分隔符是逗号,默认可以累加的字符长度为1024字节
        SET GLOBAL group_concat_max_len=102400;
        SET SESSION group_concat_max_len=102400;
        SET str = '';     
        SET area_id_str = null;
        WHILE cid is not null DO   
            SET str = concat(str, ',', cid);   
            SELECT group_concat(are_area_id) INTO cid FROM area where FIND_IN_SET(area_id, cid) > 0;   
        END WHILE; 
        select group_concat(area_id) into area_id_str from area where find_in_set(area_id, str);
        RETURN area_id_str;   
    END;

函数查询出来的结果是节点id以逗号分隔的字符串(如:a,b,c...形式)

要查询列表可以再使用:

select * from area t where FIND_IN_SET(t.area_id,getParentListById('510100'));

但这种方式查询效率非常低下,可以优化

select * from area t,(select getParentListById('510100') id) a where FIND_IN_SET(t.area_id,a.id);

 

转载于:https://my.oschina.net/u/1766298/blog/2873758

相关文章:

  • “加息”道路越走越窄,小牛在线需主动自省求变
  • Cetos 7 防火墙设置
  • 阿里云 Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR invalid password
  • 职场思想分享003 | 如何能让自己说话办事考虑的更周到?
  • Docker Enterprise 2.1 版本正式上线,全新特性先睹为快!
  • 【Zabbix】如何使用Zabbix进行IPMI监控?
  • Auto Encoder用于异常检测
  • 简单读!spring-mvc源码之url的暴露之路
  • DNS域名解析之搭建公司内部域--技术流ken
  • 认识CoreData - 初识CoreData
  • 对import的理解,python中的package和module概念
  • linux统配符
  • LeetCode刷题(Java)
  • 从PHP迁移至Golang - 基础篇
  • Spark ML流式在线学习模型初步构建分析-Spark商业ML实战
  • 「面试题」如何实现一个圣杯布局?
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ECS应用管理最佳实践
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Median of Two Sorted Arrays
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • spark本地环境的搭建到运行第一个spark程序
  • 关于使用markdown的方法(引自CSDN教程)
  • 开源地图数据可视化库——mapnik
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​插件化DPI在商用WIFI中的价值
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)(1.13) SiK无线电高级配置(五)
  • (poj1.3.2)1791(构造法模拟)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (ZT)一个美国文科博士的YardLife
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)php投票系统 毕业设计 121500
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (简单) HDU 2612 Find a way,BFS。
  • (九)c52学习之旅-定时器
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)linux文件内容查看
  • (转)重识new
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Family_物联网
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .project文件
  • @DataRedisTest测试redis从未如此丝滑
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [Geek Challenge 2023] web题解