zoukankan      html  css  js  c++  java
  • mysql递归查询组织机构

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

    创建表:

    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:

    1.根据父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

    根据函数查询:

    1.查询组织机构为1的下面所有组织机构
    select * from vrv_org_tab where FIND_IN_SET(id,getChildrenOrg(1));
    
    2.查询组织机构为2的下面所有组织机构
    select * from vrv_org_tab where FIND_IN_SET(id,getChildrenOrg(2));
    
    3.查询组织机构为6的下面所有组织机构
    select * from vrv_org_tab where FIND_IN_SET(id,getChildrenOrg(6));

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

    创建函数(这里把10000换成id就行了):

    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;

    执行sql:

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

    创建函数:

    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

    根据函数查询:

    模糊查询所有父组织机构:
    select * from vrv_org_tab where FIND_IN_SET(id,getParentOrgByOrgName('北京'));

    转载自:https://blog.csdn.net/lizhengyu891231/article/details/102532106

  • 相关阅读:
    [LeetCode] Rabbits in Forest 森林里的兔子
    [LeetCode] 780. Reaching Points 到达指定点
    [LeetCode] Swim in Rising Water 在上升的水中游泳
    [LeetCode] 777. Swap Adjacent in LR String 交换LR字符串中的相邻项
    [LeetCode] Split BST 分割二叉搜索树
    [LeetCode] Global and Local Inversions 全局与局部的倒置
    [LeetCode] Minimize Max Distance to Gas Station 最小化去加油站的最大距离
    [LeetCode] Sliding Puzzle 滑动拼图
    [LeetCode] Basic Calculator IV 基本计算器之四
    [LeetCode] Jewels and Stones 珠宝和石头
  • 原文地址:https://www.cnblogs.com/zhouheblog/p/13214945.html
Copyright © 2011-2022 走看看