Mysql 樹形結構資料表獲取子孫節點資料
阿新 • • 發佈:2019-01-28
要求:在樹形結構表中,通過提供一個數據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));
查詢結果如下: