递归查询(向上或向下)

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

  • 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')
 

向上递归

递归是一种在函数中调用自身的编程技巧。可以通过向上递归向下递归来描述递归函数的两种不同应用方式。 1. 向上递归函数(Top-down Recursion): 向上递归是指在递归函数中先处理当前问题,然后再逐步向上解决更大规模的问题,直到达到递归终止条件。这种方式通常使用递归函数的参数来传递问题的状态或规模。 例如,计算一个正整数的阶乘可以使用向上递归实现: ```python def factorial(n): if n == 0: return 1 else: return n * factorial(n-1) ``` 在上述示例中,函数首先检查终止条件(n == 0),如果满足则返回结果 1。否则,它会调用自身并将问题规模减小(n-1),直到达到终止条件。 2. 向下递归函数(Bottom-up Recursion): 向下递归是指在递归函数中先解决更大规模的问题,然后再逐步向下解决子问题,直到达到递归终止条件。这种方式通常使用递归函数的返回值来合并子问题的解决结果。 例如,计算一个正整数的斐波那契数列可以使用向下递归实现: ```python def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) ``` 在上述示例中,函数首先检查终止条件(n <= 1),如果满足则返回当前值。否则,它会调用自身并将问题分解为两个较小的子问题(n-1 和 n-2),然后将子问题的解决结果相加。 无论是向上递归还是向下递归,都需要确保递归终止条件的正确性,以避免无限递归导致栈溢出或死循环。同时,递归函数的性能也需要考虑,因为递归调用可能会导致额外的函数调用和堆栈操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LC超人在良家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值