递归查询(向上或向下)

首先要知道一些函数的使用

  • concat(),concat_ws() 字符串的拼接

  • group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’])
    可以对将要拼接的字段值去重,也可以排序,指定分隔符。若没有指定,默认以逗号分隔。它是有长度限制的,默认为 1024 字节
    所以,我们有两种方法解决这个问题:

可以通过修改 MySQL 配置文件 my.cnf ,增加 group_concat_max_len = 102400 #你要的最大长度 。

执行以下任意一个语句。SET GLOBAL group_concat_max_len=102400; 或者 SET SESSION group_concat_max_len=102400;

他们的区别在于,global是全局的,任意打开一个新的会话都会生效,但是注意,已经打开的当前会话并不会生效。而 session 是只会在当前会话生效,其他会话不生效。

共同点是,它们都会在 MySQL 重启之后失效,以配置文件中的配置为准。所以,建议直接修改配置文件。102400 的长度一般也够用了。假设一个id的长度为10个字节,也能拼上一万个id了。

除此之外,使用 group_concat 函数还有一个限制,就是不能同时使用 limit 。

向下递归

利用find_in_set()函数和group_concat()函数实现递归查询



DELIMITER //
 
CREATE  FUNCTION `getChildLst`(rootId varchar(50)) RETURNS varchar(1000) CHARSET utf8
 
BEGIN
 
DECLARE sTemp VARCHAR(1000);
 
DECLARE sTempChd VARCHAR(1000);
 
SET sTemp = '';
 
SET sTempChd =rootId;
 
WHILE sTempChd is not null DO
 
if sTempChd!=rootId then
	SET sTemp = concat(sTemp,',',sTempChd);
end if;
 
SELECT group_concat(id) INTO sTempChd FROM fl_device_group where parent<>id and FIND_IN_SET(parent,sTempChd)>0;
 
END WHILE;
 
RETURN sTemp;
 
END//




select getChildLst('2')
 

向上递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超人在良家-阿启

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值