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));

查询结果如下:

通过该文章获取信息实现:https://www.jb51.net/article/87318.htm

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值