mysql 自定义函数 递归查找父节点

1.问题描述:

现有一树形机构数据表,只有子父关系,需找到每行数据 从本节点到跟节点的路径

如:

99AA 的 path 应该为 /99AA /

A000的 path 应该为 /99AA/A000/

0100的 path 应该为 /99AA/A000/0100/

2.解决方案:

写一个递归查询父节点的函数

①创建函数向导


②函数内容

编写完成点保存,然后就可以用了

CREATE DEFINER=`root`@`%` FUNCTION `getParentNodeList`(nodeId VARCHAR(2000)) RETURNS varchar(2000) CHARSET utf8mb4
BEGIN
	  DECLARE parentList VARCHAR(2000);      # 返回父节点结果集
    DECLARE tempParent VARCHAR(2000);      # 临时存放父节点

    SET parentList = '';
    SET tempParent = nodeId; # 

    WHILE tempParent is not null DO        # 循环,用于查询节点上所有的父节点
        SET parentList = CONCAT(tempParent, '/', parentList);   # 存入到返回结果中
        SELECT p_code INTO tempParent FROM national_industry where code = tempParent limit 1;   # 查询节点上所有父节点
    END WHILE;
    RETURN parentList;       # 将返回结果处理,截取掉结果集前面的逗号
END

注意:

SELECT p_code INTO tempParent FROM national_industry where code = tempParent limit 1;

不加 limit1 会存在问题:

指定查询:

SELECT getParentNodeList('0620') 

结果:

 全部查询:

SELECT getParentNodeList(code)  FROM national_industry

会报错:

NTO子句可以命名一个或多个变量的列表,这些变量可以是用户自定义的变量,存储过程或函数的参数,或存储的程序的局部变量。而对于预编译的SELECT...INTO OUTFILE,只允许使用用户自定义变量,see Section 13.6.4.2, “Local Variable Scope and Resolution”。

select后选定的值将分配给into后的变量,变量的数量必须与列数相匹配。如果查询未返回任何行,则会出现错误代码为1329的警告(No Data),并且变量的值保持不变。如果查询返回多个行,报错error 1172:Rseult consisted of more than one row,当然可以使用LIMIT 1来解决这个问题。

加上 limit 1 查询

③自定义函数更多语法

https://zhuanlan.zhihu.com/p/128744140

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值