zhouheblog

父子查询: 根据父 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

 

分类:

技术点:

相关文章:

  • 2021-12-19
  • 2021-12-25
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-01-02
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
  • 2021-12-29
相关资源
相似解决方案