mysql递归查询

mysql递归查询父子查询:根据父id查询下面所有子节点数据;子父查询:根据子id查询上面所有父节点数据;                                                                                                          ————mysql递归查询目录结构: 创建表并添加测试数据 创建…

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

父子查询: 根据父 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递归查询所有子节点

创建函数

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语句

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。

 

这里写图片描述

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

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

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

创建函数

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.net/147649.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle dba教程视频_oracledatabase dba手册

    oracle dba教程视频_oracledatabase dba手册我机器上只有一部分的版本:http://v.youku.com/v_show/id_XMTk3MTgzMzI=.htmlhttp://www.ixdba.net/article/b3/1317.htmlhttp://itboba.com/taxonomy/term/620http://v.youku.com/v_playlist/f2972170o1p9.html

    2022年9月26日
    5
  • css颜色渐变问题

    css颜色渐变问题效果如下 效果如下 上图 0deg 即为自下向上的渐变线 90deg 即为自左往右的渐变线根据设定特殊角度的渐变线就可以实现想要的效果透明度设置 transparent 添加透明度可以设置 rgba 函数中的最后一个参数透明度定义是从 0 到 1 的值 0 表示完全透明 1 表示完全不透明 重复线性渐变 repeating linear gradient 径向渐变 径向渐变由中心定义 同样必须至少有两个颜色节点可以设置渐变中心 形状 圆形 椭圆 大小 默认情况下实在中心 center 效

    2025年12月1日
    5
  • 《Unity开发实战》——3.5节创建透明纹理贴图

    《Unity开发实战》——3.5节创建透明纹理贴图

    2022年3月4日
    39
  • linux系统配置jdk环境变量_linux中环境变量配置

    linux系统配置jdk环境变量_linux中环境变量配置Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)

    2025年7月21日
    7
  • allow_url_fopen设置

    allow_url_fopen设置使用file,fopen或file_get_contents函数打开远程url时,需要PHP配置中(php.ini)将allow_url_fopen的值设置为On。按照默认设置,这个值本身就是On的。如果allow_url_fopen已经为on,但file,fopen,file_get_contents依然报错,就是服务器的DNS问题,造成了路由结果中有部份路由执行超时,最终PHP执行…

    2022年7月16日
    29
  • ElasticSearch安装配置(es)[通俗易懂]

    ElasticSearch安装配置(es)[通俗易懂]一、安装配置es1、搭建配置es#创建es容器#es的端口#9200走http协议端口#9300代码层面tcp端口dockerrun-di–nameelasticsearch-p9200:9200-p9300:9300elasticsearch:6.5.0#登录es容器dockerexec-itelasticsearch/bin/bash#修改elasticsearch.yml文件,添加跨域配置http.cors.enabled:..

    2022年6月16日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号