一、创建函数
CREATE FUNCTION queryTree(`rId` int) RETURNS varchar(500)
BEGIN
#声明两个局部变量
DECLARE sTemp VARCHAR(500);
DECLARE stempChd VARCHAR(500);
#初始化局部变量
SET sTemp = '';
#调用cast函数将int转换为char
SET stempChd = CAST(rId AS CHAR);
#查询
WHILE stempChd is not NULL DO
#存储每次递归结果
SET sTemp = stempChd;
#将参数作为id,然后查询其pid,然后将子 pid 作为id,
#查询以 pid 为 id 的 pid ,依次循环下去,直到顶级
SELECT GROUP_CONCAT(pid) INTO stempChd FROM mine_user where FIND_IN_SET(id,stempChd)>0 AND pid>0;
END WHILE;
#返回 结果
RETURN sTemp;
END;这里我们定义的函数queryTree,在内部定义了2个变量 sTemp 和 stempChd ,stempChd 用于存储当前查询的id,children用于存储 通过不为null判断的 id。
接下来我们分析一下执行流程(假设我们查询的rId= 8 ,该关系链为 1->3->5->8):
- 先把我们要查询的跟节点id赋值给stempChd ,此时stempChd = ‘8’,sTemp =''。
- 这个时候stempChd 不为null,所以会进入到循环,首先会进行字符串连接,执行SET sTemp = stempChd(把通过判断的id赋给sTemp )之后,此时sTemp =‘8’;
- 重新赋值stempChd,FIND_IN_SET(id,stempChd)查询的就是在表中id为8的数据,此时stempChd='5'.(在下一次循环的时候,stempChd的值就会覆盖掉 sTemp 的值)。
- 因为stempChd不为null,所以会重复2,3。
- 直到 stempChd='1',stempChd不为null,执行SET sTemp = stempChd,sTemp =1,因为查询条件有 pid>0 所以 这时循环里的 stempChd='',循环结束返回结果 sTemp;结果为1;
二、执行方式
select queryTree(8);三、创建函数时可能会报错:
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
- DETERMINISTIC 确定性的
- NO SQL 没有SQl语句,当然也不会修改数据
- READS SQL DATA 只是读取数据,当然也不会修改数据
- MODIFIES SQL DATA 要修改数据
- CONTAINS SQL 包含了SQL语句
其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
在MySQL中创建函数时出现这种错误的解决方法,使用root权限账户执行:
set global log_bin_trust_function_creators=TRUE; 最后一次更新于2021-08-14



0 条评论