mysql递归方法。

本文提供了一个SQL函数,用于通过输入的rootid查询并返回该节点及其所有子节点的ID列表。使用了GROUP_CONCAT函数和FIND_IN_SET函数来实现递归查询。

 

 

DROP FUNCTION IF EXISTS `getChildLst`;

 

CREATE DEFINER = `root`@`%` FUNCTION `getChildLst`(rootId INT)

 RETURNS varchar(1000)

BEGIN 

DECLARE sTemp VARCHAR(3000);

DECLARE sTempChd VARCHAR(3000);

SET sTemp = "-1";

SET sTempChd =cast(rootId as CHAR);

WHILE sTempChd is not null DO

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

SELECT GROUP_CONCAT(g.groupid) INTO sTempChd FROM wcmgroup g where FIND_IN_SET(g.parentid, sTempChd)>0;

END WHILE;

RETURN sTemp;

END;

 

 

通过rootid遍历rootid一下的所有子节点

### MySQL递归查询的方法和实现 #### 使用 `WITH RECURSIVE` 实现递归查询 在现代版本的 MySQL(自 8.0 开始支持),可以通过 `WITH RECURSIVE` 子句来实现递归查询。这种方法适用于处理层次结构的数据,比如树形结构或父子关系表。 以下是通过 `WITH RECURSIVE` 查询父节点及其所有子节点的示例: ```sql -- 创建测试表并插入数据 CREATE TABLE tree ( id INT PRIMARY KEY, parent_id INT DEFAULT NULL, name VARCHAR(50) ); INSERT INTO tree (id, parent_id, name) VALUES (1, NULL, 'A'), (2, 1, 'B'), (3, 1, 'C'), (4, 2, 'D'), (5, 2, 'E'); -- 使用 WITH RECURSIVE 进行递归查询 WITH RECURSIVE cte AS ( -- 基础部分:选择根节点 SELECT id, parent_id, name, CAST(name AS CHAR(100)) AS path FROM tree WHERE id = 1 UNION ALL -- 递归部分:找到当前节点的所有子节点 SELECT t.id, t.parent_id, t.name, CONCAT(cte.path, '->', t.name) FROM tree t INNER JOIN cte ON t.parent_id = cte.id ) SELECT * FROM cte; ``` 此代码片段展示了如何从指定的根节点出发,逐步获取其所有的后代节点,并构建路径字符串[^2]。 --- #### 使用 `FIND_IN_SET()` 和 `GROUP_CONCAT()` 的传统方法 对于不支持 `WITH RECURSIVE` 的旧版 MySQL,可以采用基于 `FIND_IN_SET()` 和 `GROUP_CONCAT()` 的方式模拟递归效果。这种方式通常用于扁平化存储的树状结构。 以下是一个例子: ```sql -- 初始化临时变量 SET @pv := ''; -- 执行递归查询 SELECT DISTINCT t1.* FROM tree t1 JOIN tree t2 ON FIND_IN_SET(t2.id, @pv) > 0 OR t1.parent_id = t2.id WHERE t1.id = 1 AND (@pv := CONCAT(@pv, ',', t1.id)); ``` 这段代码的核心在于利用会话级变量动态扩展匹配条件,从而达到逐层遍历的效果[^1]。 需要注意的是,在实际应用中可能需要调整字段名称以及逻辑以适配具体业务场景。 --- #### 处理潜在问题 当定义涉及递归操作的存储过程或者函数时,可能会遇到权限相关错误。例如,“Error Code: 1418”的提示表明二进制日志功能阻止了不确定性的函数创建。此时可通过设置全局参数解决这一限制: ```sql SHOW VARIABLES LIKE "log_bin_trust_function_creators"; SET GLOBAL log_bin_trust_function_creators = 1; ``` 上述命令允许更灵活地管理用户自定义函数的行为模式[^4]。 --- #### 性能考量 尽管递归查询提供了强大的表达能力,但在大规模数据集上的表现仍需谨慎评估。特别是依赖于多次连接运算的传统方案,容易引发性能瓶颈。因此建议针对特定需求优化索引设计,并定期审查执行计划。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值