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