mysql 组织层级查询_mysql 层级结构查询

本文介绍了如何在MySQL中使用自定义函数解决组织层级查询问题,提供了创建和使用`getParList`(查询所有父节点ID)和`getChildList`(查询所有子节点ID)的函数示例,并给出了具体的SQL脚本和执行结果。
摘要由CSDN通过智能技术生成

描述:最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!! 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

好记性不如烂笔头

下面给出一个function来完成的方法

下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

创建表treenodes(可以根据需要进行更改)

– Table structure for treenodes

DROP TABLE IF EXISTS treenodes;

CREATE TABLE treenodes (

id int(11) NOT NULL,

nodename varchar(20) DEFAULT NULL,

pid int(11) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

– Table structure for treenodes

插入几条数据

– Records of treenodes

INSERT INTO treenodes VALUES (‘1’, ‘A’, ‘0’);

INSERT INTO treenodes VALUES (‘2’, ‘B’, ‘1’);

INSERT INTO treenodes VALUES (‘3’, ‘C’, ‘1’);

INSERT INTO treenodes VALUES (‘4’, ‘D’, ‘2’);

INSERT INTO treenodes VALUES (‘5’, ‘E’, ‘2’);

INSERT INTO treenodes VALUES (‘6’, ‘F’, ‘3’);

INSERT INTO treenodes VALUES (‘7’, ‘G’, ‘6’);

INSERT INTO treenodes VALUES (‘8’, ‘H’, ‘0’);

INSERT INTO treenodes VALUES (‘9’, ‘I’, ‘8’);

INSERT INTO treenodes VALUES (‘10’, ‘J’, ‘8’);

INSERT INTO treenodes VALUES (‘11’, ‘K’, ‘8’);

INSERT INTO treenodes VALUES (‘12’, ‘L’, ‘9’);

INSERT INTO treenodes VALUES (‘13’, ‘M’, ‘9’);

INSERT INTO treenodes VALUES (‘14’, ‘N’, ‘12’);

INSERT INTO treenodes VALUES (‘15’, ‘O’, ‘12’);

INSERT INTO treenodes VALUES (‘16’, ‘P’, ‘15’);

INSERT INTO treenodes VALUES (‘17’, ‘Q’, ‘15’);

把下面的语句直接粘贴进命令行执行即可(注意修改传入的参数,默认rootId,表明默认treenodes)

根据传入id查询所有父节点的id

delimiter //

CREATE FUNCTION `getParList`(rootId INT)

RETURNS varchar(1000)

BEGIN

DECLARE sTemp VARCHAR(1000);

DECLARE sTempPar VARCHAR(1000);

SET sTemp= '';

SET sTempPar=rootId;

#循环递归

WHILE sTempParis not nullDO

#判断是否是第一个,不加的话第一个会为空

IF sTemp!= ''THEN

SET sTemp= concat(sTemp,',',sTempPar);

ELSE

SET sTemp=sTempPar;

END IF;

SET sTemp= concat(sTemp,',',sTempPar);

SELECT group_concat(pid) INTO sTempPar FROM treenodeswhere pid<>id and FIND_IN_SET(id,sTempPar)>0;

END WHILE;

RETURN sTemp;

END//

执行命令

select * from treenodes where FIND_IN_SET(id,getParList(15));

结果:

7e461af868249936a984c65fb5bda191.png 

根据传入id查询所有子节点的id

delimiter //

CREATE FUNCTION `getChildList`(rootId INT)

RETURNS varchar(1000)

BEGIN

DECLARE sTemp VARCHAR(1000);

DECLARE sTempChd VARCHAR(1000);

SET sTemp= '$';

SET sTempChd=cast(rootId asCHAR);

WHILE sTempChdis not nullDO

SET sTemp= concat(sTemp,',',sTempChd);

SELECT group_concat(id) INTO sTempChd FROM treeNodeswhere FIND_IN_SET(pid,sTempChd)>0;

END WHILE;

RETURN sTemp;

END//

执行命令

select * from treenodes where FIND_IN_SET(id,getChildList(7));

结果:

14aff44bf9df257c21e5b2ce2c89b110.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值