1. 程式人生 > >Mysql 樹形結構資料表獲取子孫節點資料

Mysql 樹形結構資料表獲取子孫節點資料

要求:在樹形結構表中,通過提供一個數據id獲取其子孫節點(含自己)的所有資料集合。

前提:1、新建樹形結構表,就是含id,父級id(關聯自己id)的那種,如:

DROP TABLE IF EXISTS `tblorg`;
CREATE TABLE `tblorg` (
  `orgId` varchar(50) NOT NULL,            #資料ID
  `parentOrgId` varchar(50) DEFAULT NULL,  #父級ID
  `orgName` varchar(50) DEFAULT NULL,      #名稱
  PRIMARY KEY (`orgId`),
  KEY `FK_Reference_52` (`parentOrgId`),   #父級ID關聯自己
  CONSTRAINT `FK_Reference_52` FOREIGN KEY (`parentOrgId`) REFERENCES `tblorg` (`orgId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、插入資料:

INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('1', NULL, '根目錄');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('2', '1', '一級目錄1');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('3', '1', '一級目錄2');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('4', '1', '一級目錄3');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('5', '1', '一級目錄4');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('6', '1', '一級目錄5');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('7', '1', '一級目錄6');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('8', '2', '二級目錄11');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('9', '2', '二級目錄12');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('10', '2', '二級目錄13');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('aaa', '8', '三級目錄111');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('bbb', '8', '三級目錄112');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('ccc', '9', '三級目錄121');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('ddd', '10', '三級目錄131');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('15', '3', '二級目錄21');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('16', '3', '二級目錄22');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('eee', '15', '三級目錄211');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('18', '4', '二級目錄31');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('19', '5', '二級目錄41');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('20', '6', '二級目錄51');
INSERT INTO `tblorg` (`orgId`, `parentOrgId`, `orgName`) VALUES ('fff', '20', '三級目錄511');

這樣我們就有了一個樹形結構的資料表和相關資料,那麼,我現在提需求,我要獲取orgId=2的所有子孫資料(含自己)。

做法:1、新建 getChildLst 函式,直接在mysql的查詢中執行以下程式碼就行了,如果我們在自己表中用下面的程式碼只需將第11行的orgId(表ID)、parentOrgId(父級ID)、tblorg(表名)換成自己的就可以

#樹形結構方法,通過某個節點id獲取該節點一下所有子孫節點的資料
CREATE FUNCTION `getChildLst`(rootId VARCHAR(1000))
   RETURNS varchar(1000)
   BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);
  
    SET sTemp = '$';
    SET sTempChd =cast(rootId as CHAR);
  
    WHILE sTempChd is not null DO
     SET sTemp = concat(sTemp,',',sTempChd);
     SELECT group_concat(orgid) INTO sTempChd FROM tblorg where FIND_IN_SET(parentOrgId,sTempChd)>0;
    END WHILE;
    RETURN sTemp;
   END

2、通過上面的函式,直接執行以下程式碼即可查詢出所需資料:

#使用方法,獲取orgId=2的所有子孫節點(含自己2)
select orgid from tblorg
   where FIND_IN_SET(orgid, getChildLst(2));

查詢結果如下: