要求:在树形结构表中,通过提供一个数据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));
查询结果如下:
通过该文章获取信息实现:https://www.jb51.net/article/87318.htm