MySQL开发实例:用递归查询组织机构
沉沙 2018-05-17 来源 : 阅读 1867 评论 0

摘要:本篇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;

MySQL开发实例:用递归查询组织机构

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

创建函数

create function getChildrenOrg(orgid INT)
returns varchar(4000)BEGINDECLARE oTemp VARCHAR(4000);
DECLARE oTempChild VARCHAR(4000);
SET oTemp = '';SET oTempChild = CAST(orgid AS CHAR);
 
WHILE oTempChild IS NOT NULLDOSET 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


根据函数查询 

MySQL开发实例:用递归查询组织机构

根据子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.idORDER BY id;



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

 MySQL开发实例:用递归查询组织机构



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

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

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

创建函数

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 = 0DOIF sPid IS NULL THENSET 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

根据函数查询

MySQL开发实例:用递归查询组织机构 



本文由职坐标整理并发布,了解更多内容,请关注职坐标数据库MySQL频道!

 


本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程