【mysql 递归查询】Mysql中的递归层次查询(父子查询)

2024-09-07 06:48

本文主要是介绍【mysql 递归查询】Mysql中的递归层次查询(父子查询),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?

SELECT id,name,parent_id   from b_company

数据长这样子,id是父节点,parent_id 是子节点

id  name    parent_id
1   草根总公司   
24  浙江金爱农网络科技有限公司   1
25  衢州分公司   24
26  江山直营点   25
27  宁波分公司   24
28  常山直营点   25
29  衢江直营点   25
30  龙游直营点   25
31  开化直营点   25
32  金华分公司   24
33  丽水分公司   24
34  鄞州直营点   27
35  余姚直营点   27
36  金东直营点   32
37  永康直营点   32
38  莲都直营点   33
....
....

下面给出一个function来完成方法

根据传入id查询所有父节点的id

CREATE  FUNCTION `getParList`(rootId INT) RETURNS varchar(1000) CHARSET utf8
BEGINDECLARE sTemp VARCHAR(1000);DECLARE sTempPar VARCHAR(1000); SET sTemp = ''; SET sTempPar =rootId; #循环递归WHILE sTempPar is not null DO #判断是否是第一个,不加的话第一个会为空IF sTemp != '' THENSET sTemp = concat(sTemp,',',sTempPar);ELSESET sTemp = sTempPar;END IF;SET sTemp = concat(sTemp,',',sTempPar); SELECT group_concat(parent_id) INTO sTempPar FROM b_company where parent_id<>id and FIND_IN_SET(id,sTempPar)>0; END WHILE; RETURN sTemp; 
END

根据子节点 查询所有父节点

select id,name,parent_id from b_company where FIND_IN_SET(id,getParList(35));
id  name    parent_id
1   草根总公司   
24  浙江金爱农网络科技有限公司   1
27  宁波分公司   24
35  余姚直营点   27
######查询优化
######方法1:
select getParList_information(2697)  into @m1;
SELECTid,pid,name
FROMbusi_information_config 
WHEREFIND_IN_SET(id,(select @m1))######方法2:SELECTid,pid,name
FROMbusi_information_config ,(select getParList_information(2697) as tmp)t
WHEREFIND_IN_SET(id,t.tmp)

尽量用临时表 传给函数,提高查询效率

这篇关于【mysql 递归查询】Mysql中的递归层次查询(父子查询)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144365

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口