700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > mysql 递归查找父节点_MySQL递归查询父子节点

mysql 递归查找父节点_MySQL递归查询父子节点

时间:2020-06-24 11:00:15

相关推荐

mysql 递归查找父节点_MySQL递归查询父子节点

1.表结构

CREATE TABLE folder(

id BIGINT(20) NOT NULL,

parent_id BIGINT(20) DEFAULT NULL,

PRIMARY KEY id

);

2.根据传入id查询所有子节点及其的id

创建函数:

CREATE FUNCTION `getParList`(rootId BIGINT)

RETURNS varchar(1000)

BEGIN

DECLARE sTemp VARCHAR(1000);

DECLARE sTempPar VARCHAR(1000);

SET sTemp = '';

SET sTempPar =rootId;

#循环递归

WHILE sTempPar is not null DO

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

IF sTemp != '' THEN

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

ELSE

SET sTemp = sTempPar;

END IF;

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

SELECT group_concat(parent_id) INTO sTempPar FROM folder where parent_id<>id and FIND_IN_SET(id,sTempPar)>0;

END WHILE;

RETURN sTemp;

END

调用:

select id

from folder

where FIND_IN_SET(id,getChildList(2))

3.根据传入id查询所有父节点及其的id

创建函数:

CREATE FUNCTION `getChildList`(rootId BIGINT)

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(id) INTO sTempChd FROM folder where FIND_IN_SET(parent_id,sTempChd)>0;

END WHILE;

RETURN sTemp;

END

调用:

select id

from folder

where FIND_IN_SET(id,getParList(10))

这是我们开启了bin-log, 我们就必须指定我们的函数是否是

1 DETERMINISTIC 不确定的

2 NO SQL 没有SQl语句,当然也不会修改数据

3 READS SQL DATA 只是读取数据,当然也不会修改数据

4 MODIFIES SQL DATA 要修改数据

5 CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

在MySQL中创建函数时出现这种错误的解决方法:

set global log_bin_trust_function_creators=TRUE;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。