Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >mysql递归查询

mysql递归查询

作者头像
全栈程序员站长
发布于 2022-07-02 03:13:44
发布于 2022-07-02 03:13:44
3.9K0
举报

大家好,又见面了,我是你们的朋友全栈君。

父子查询: 根据父 id 查询下面所有子节点数据;子父查询: 根据子 id 查询上面所有父节点数据; ————mysql递归查询

目录结构:

创建表,并添加测试数据

创建表

DROP TABLE IF EXISTS vrv_org_tab; CREATE TABLE vrv_org_tab ( id bigint(8) NOT NULL AUTO_INCREMENT, org_name varchar(50) NOT NULL, org_level int(4) NOT NULL DEFAULT ‘0’, org_parent_id bigint(8) NOT NULL DEFAULT ‘0’, PRIMARY KEY (id), UNIQUE KEY unique_org_name (org_name) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

添加数据

INSERT INTO vrv_org_tab VALUES (‘1’, ‘北信源’, ‘1’, ‘0’); INSERT INTO vrv_org_tab VALUES (‘2’, ‘北京’, ‘2’, ‘1’); INSERT INTO vrv_org_tab VALUES (‘3’, ‘南京’, ‘2’, ‘1’); INSERT INTO vrv_org_tab VALUES (‘4’, ‘武汉’, ‘2’, ‘1’); INSERT INTO vrv_org_tab VALUES (‘5’, ‘上海’, ‘2’, ‘1’); INSERT INTO vrv_org_tab VALUES (‘6’, ‘北京研发中心’, ‘3’, ‘2’); INSERT INTO vrv_org_tab VALUES (‘7’, ‘南京研发中心’, ‘3’, ‘3’); INSERT INTO vrv_org_tab VALUES (‘8’, ‘武汉研发中心’, ‘3’, ‘4’); INSERT INTO vrv_org_tab VALUES (‘9’, ‘上海研发中心’, ‘3’, ‘5’); INSERT INTO vrv_org_tab VALUES (‘10’, ‘北京EMM项目组’, ‘4’, ‘6’); INSERT INTO vrv_org_tab VALUES (‘11’, ‘北京linkdd项目组’, ‘4’, ‘6’); INSERT INTO vrv_org_tab VALUES (‘12’, ‘南京EMM项目组’, ‘4’, ‘7’); INSERT INTO vrv_org_tab VALUES (‘13’, ‘南京linkdd项目组’, ‘4’, ‘7’); INSERT INTO vrv_org_tab VALUES (‘14’, ‘武汉EMM项目组’, ‘4’, ‘8’); INSERT INTO vrv_org_tab VALUES (‘15’, ‘武汉linkdd项目组’, ‘4’, ‘8’); INSERT INTO vrv_org_tab VALUES (‘16’, ‘上海EMM项目组’, ‘4’, ‘9’); INSERT INTO vrv_org_tab VALUES (‘17’, ‘上海linkdd项目组’, ‘4’, ‘9’);

select * from vrv_org_tab;

根据父id递归查询所有子节点

创建函数

代码语言:javascript
AI代码解释
复制
create function getChildrenOrg(orgid INT)
returns varchar(4000)
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 vrv_org_tab WHERE FIND_IN_SET(org_parent_id,oTempChild) > 0;
END WHILE;
RETURN oTemp;
END

根据函数查询

根据子id递归查询所有父节点

根据子id查询父节点就不那么麻烦了,不需要写递归函数,当然,你也可以写递归函数来查询。我这边提供的是不写函数的方式。请看代码

写sql语句

代码语言:javascript
AI代码解释
复制
SELECT id,org_name,org_level,org_parent_id
    FROM ( 
        SELECT 
                @r AS _id, 
                (SELECT @r := org_parent_id FROM vrv_org_tab WHERE id = _id) AS parent_id, 
                 @l := @l + 1 AS lvl 
        FROM 
                (SELECT @r := 10000, @l := 0) vars, 
                vrv_org_tab h 
        WHERE @r <> 0) T1 
    JOIN vrv_org_tab T2 
    ON T1._id = T2.id
ORDER BY id;

注意:大家看到那个10000了吗,就是我们的子节点id。

注意:只支持单个查询,意思是不可以根据两个或者两个以上的子节点同时查询出所有父节点。我们可以看到,上面参数都是单个值进行递归查询的。 西面提供一个函数支持多个查询

根据组织机构名称模糊查询所有父节点

该功能常用于组织机构模糊搜索

创建函数

代码语言:javascript
AI代码解释
复制
CREATE FUNCTION getParentOrgByOrgName(orgName VARCHAR(20))
RETURNS VARCHAR(4000)
BEGIN
    DECLARE sPid VARCHAR(1000);
    DECLARE sPidTemp VARCHAR(1000);
    DECLARE pid VARCHAR(1000);
    DECLARE count INT DEFAULT 0;
    DECLARE allpid VARCHAR(4000);

    SET sPidTemp = '';
    SELECT GROUP_CONCAT(DISTINCT(CAST(id AS CHAR))) INTO sPid 
    FROM vrv_org_tab WHERE org_name LIKE CONCAT('%',orgName,'%');

    SET allpid = '';
WHILE count = 0
DO
IF sPid IS NULL THEN
SET allpid = '-1';
SET count = 1;
ELSE
    SET pid = SUBSTRING_INDEX(sPid,',',1);
    SET sPidTemp = CONCAT(sPidTemp,',',pid);
    IF LENGTH(pid) = LENGTH(sPid) THEN
        SET count = 1;
        SET sPid = SUBSTRING(sPid FROM LENGTH(SUBSTRING_INDEX(sPid,',',1)) FOR LENGTH(sPid)+1);
    ELSE
        SET sPid = SUBSTRING(sPid FROM LENGTH(SUBSTRING_INDEX(sPid,',',1))+2 FOR LENGTH(sPid)+1);
    END IF;
    SELECT GROUP_CONCAT(CAST(id AS CHAR)) INTO sPidTemp
            FROM ( 
                    SELECT 
                            @r AS _id, 
                            (SELECT @r := org_parent_id FROM vrv_org_tab WHERE id = _id) AS parent_id, 
                            @l := @l + 1 AS lvl 
                    FROM 
                            (SELECT @r := pid, @l := 0) vars, 
                            vrv_org_tab h 
                    WHERE @r <> 0) T1 
            JOIN vrv_org_tab T2 
            ON T1._id = T2.id;
    SET allpid = CONCAT_WS(',',pid,sPidTemp,allpid);
END IF;
END WHILE;
RETURN allpid;
END

根据函数查询

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147649.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql省市区递归查询_mysql 递归查询
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;
全栈程序员站长
2022/07/02
12.7K0
mysql省市区递归查询_mysql 递归查询
同事问我MySQL怎么递归查询,我懵逼了...
最近在做的业务场景涉及到了数据库的递归查询。我们公司用的 Oracle ,众所周知,Oracle 自带有递归查询的功能,所以实现起来特别简单。
烟雨星空
2020/08/04
3.5K0
mysql递归查询方法|mysql递归查询遇到的坑,教你们解决办法
相信很多人都用不惯mysql,小编也是,oracle的递归查询很简单。就一句sql就可以搞定,还有不清楚或者突然忘记需要温习的小伙伴们,大家可以看小编发的以前的关于oracle递归查询的方法,戳这里:【oracle递归查询方法介绍】
小小鱼儿小小林
2020/06/23
1.7K0
MySQL递归查询 三种实现方式
2.3. 方式三 MySQL 8.0 版本以上 使用 WITH RECURSIVE 实现递归
全栈程序员站长
2022/09/14
12K0
MySQL递归查询 三种实现方式
探索 MySQL 递归查询,优雅的给树结构分页!
递归查询是一种在数据库中处理具有层级结构数据的技术。它通过在查询语句中嵌套引用自身,以实现对嵌套数据的查询。递归查询在处理树状结构、父子关系或层级关系的数据时非常有用。
程序员蜗牛
2024/03/13
1.7K0
探索 MySQL 递归查询,优雅的给树结构分页!
mysql树形结构递归查询
之前一直用的是Oracle,对于树形查询可以使用start with ... connect by 
陈灬大灬海
2018/09/12
9.8K0
mysql树形结构递归查询
SQL如何实现MYSQL的递归查询,SQL实现MYSQL递归
所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。
IT小马哥
2020/03/18
5.8K0
树形结构!别再用递归实现了,这才是最佳的方案;更快!更强!更好用!
不管你是做前端还是后端的开发,那我相信树形结构的需求一定有遇到过,特别是管理平台类型的项目,一般都会有一个树形结构的菜单栏,再比如说,公司组织架构,层级关系、归属关系等等需求,本质上都是树形结构的一种体现;
一行Java
2022/09/03
15.9K2
树形结构!别再用递归实现了,这才是最佳的方案;更快!更强!更好用!
Mysql实现树形递归查询
最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的函数,mysql并没有,所以就只好想自定义函数或者找到替换函数的方法进行改造。
SmileNicky
2019/03/04
5.9K1
mysql 层级结构查询
描述:最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!! 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。
用户1217611
2019/05/25
3.4K0
MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用
在MySL使用递归查询是很不方便的,不像SQL Server可以直接使用声明变量,使用虚拟表等等。如:DECLARE,BEGIN ...  END   ,WHILE ,IF 等等。
星哥玩云
2022/08/17
3.2K0
MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用
MySQL 递归查询实践总结
SELECT id, `name`, parent_id FROM `tb_testcase_suite`
授客
2020/04/10
2.1K0
MySQL 递归查询实践总结
SQLServer CTE 递归查询
在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询,递归查询主要用于层次结构的查询,从叶级(Leaf Level)向顶层(Root Level)查询,或从顶层向叶级查询,或递归的路径(Path)。
挽风
2021/04/13
2.1K0
SQLServer CTE 递归查询
数据库实战:MySQL CTE处理树形结构实战指南
"我们的部门结构又调整了!"这可能是DBA最常听到的噩梦之一。在现实业务场景中,组织机构、产品分类、权限体系等数据往往呈现树形结构。传统解决方案要么需要多次查询拼接数据,要么需要维护复杂的路径字段。直到MySQL 8.0带来WITH RECURSIVE语法,我们终于拥有了处理树形数据的终极武器。
小明互联网技术分享社区
2025/07/12
2940
数据库实战:MySQL CTE处理树形结构实战指南
探索MySQL递归查询:处理层次结构数据
在数据库管理中,处理具有层次结构的数据一直是一项常见任务。MySQL的递归查询功能通过公用表表达式(CTE)为处理这类数据提供了便捷的方式。递归查询可以用于管理组织结构、目录树等数据,使您能够轻松地查询任意节点的子节点、父节点或整个路径。
俊才
2024/04/15
2.2K0
探索MySQL递归查询:处理层次结构数据
SQL中的递归查询
SQL Server中的递归查询是通过CTE(表表达式)来实现。至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。
SQL数据库开发
2024/04/25
2.4K0
SQL中的递归查询
多级部门查询性能问题解决方案
其实,涉及部门层级关系的问题在很多情形下都会遇到,特别是针对toB的应用开发场景。 但奇葩的是,在我们的项目里头,项目经理在前期需求调研时,预估的用户部门最大数为1k,于是相关的开发同事就按照最大数1k*4=4k的目标进行了设计实现,而真正交付到用户生产环境时同步的数据是1w。 What?也就是说,即使之前已经按照最大预估数进行了4倍数放大设计,但是现在是10倍。于是,各种问题接踵而至。 导致该问题出现的原因主要有一下几点:
编程随笔
2019/06/27
1.6K0
多级部门查询性能问题解决方案
mysql的递归查询
对于树结构的查询,在oracle数据库中有现成的函数直接调用,但是在mysql中这部分没有现成的函数可以直接调用,对于树形结构的递归遍历在实际业务中也是非常常见的。本小节做一个记录
在水一方
2022/06/14
3K0
mysql的递归查询
使用DeepSeek-V3优化SQL递归查询:从性能瓶颈到高效解决方案
在最近的项目中,我需要查询一个大型组织架构中某个分支下的所有员工。公司组织架构有8个层级,员工数量超过10万人。使用传统的CTE(Common Table Expression)递归查询时,响应时间达到了惊人的2.3秒,这完全无法满足产品的性能要求。
大王叫我来巡山、
2025/09/11
2530
MySQL实现树的遍历
用户1148526
2018/01/03
1.8K0
相关推荐
mysql省市区递归查询_mysql 递归查询
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场