相关文章推荐
想表白的饼干  ·  IBM Documentation·  1 周前    · 
谈吐大方的茄子  ·  “存款利率调降”连锁效应,资本再掀长期国债买 ...·  1 年前    · 
英俊的铁板烧  ·  10 种机器学习算法的要点(附 ...·  1 年前    · 
踢足球的毛豆  ·  Android Studio ...·  1 年前    · 
狂野的伏特加  ·  FFmpeg在Linux下搭建 *** - ...·  2 年前    · 
Code  ›  mysql递归查询开发者社区
mysql select 递归 varchar
https://cloud.tencent.com/developer/article/2038195
卖萌的沙发
1 年前
全栈程序员站长

mysql递归查询

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
全栈程序员站长
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > mysql递归查询

mysql递归查询

作者头像
全栈程序员站长
发布 于 2022-07-02 11:13:44
2.9K 0
发布 于 2022-07-02 11:13:44
举报
文章被收录于专栏: 全栈程序员必看

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

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

目录结构:

  • 创建表并添加测试数据
    • 创建表
    • 添加数据
  • 根据父id递归查询所有子节点
    • 创建函数
    • 根据函数查询
  • 根据子id递归查询所有父节点
    • 写sql语句
  • 根据组织机构名称模糊查询所有父节点
    • 创建函数
    • 根据函数查询

创建表,并添加测试数据

创建表

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
复制
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
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
复制
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 
                (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
复制
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
IF sPid IS NULL THEN
SET allpid = '-1';
SET count = 1;
    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);
        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 
                            (SELECT @r := pid, @l := 0) vars, 
                            vrv_org_tab h 
                    WHERE @r <> 0) T1 
            JOIN vrv_org_tab T2 
 
推荐文章
想表白的饼干  ·  IBM Documentation
1 周前
谈吐大方的茄子  ·  “存款利率调降”连锁效应,资本再掀长期国债买涨潮 - 21经济网
1 年前
英俊的铁板烧  ·  10 种机器学习算法的要点(附 Python 和 R 代码) - jingsupo - 博客园
1 年前
踢足球的毛豆  ·  Android Studio 缺少raw文件夹或目录(R.raw报错)的一种解决方法-CSDN博客
1 年前
狂野的伏特加  ·  FFmpeg在Linux下搭建 *** - 江召伟 - 博客园
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号