我的函数定义如下:
CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8 BEGIN DECLARE sTemp VARCHAR(5000); DECLARE sTempChd VARCHAR(1000); SET sTemp = '$'; IF direction=1 THEN SET sTempChd =cast(rootId as CHAR); ELSEIF direction=2 THEN SELECT cast(ParentId as CHAR) into sTempChd FROM Tree WHERE Id=rootId;END IF; WHILE sTempChd is not null DO SET sTemp = concat(sTemp,',',sTempChd); SELECT group_concat(id) INTO sTempChd FROM Tree where (direction=1 and FIND_IN_SET(ParentId,sTempChd)>0) or (direction=2 and FIND_IN_SET(Id,sTempChd)>0); END WHILE; RETURN sTemp; END
就是一个根据ID获取下级或父级ID
用法:
select * from tree where find_in_set(id,getChildLst(3,1)); 下查没有问题
select * from tree where find_in_set(id,getChildLst(3,2));上查就报错
报错:
Error Code: 1406. Data too long for column 'sTemp' at row 7
本人初用MYSQL,求MYSQL高手指教,谢谢!
SET sTemp = concat(sTemp,',',sTempChd); 怀疑caoncat的结果,超过了sTemp的长度。
我表的数据内容如下:
ID Name ParendId
1 | 一级 | 0 |
2 | 2级 | 1 |
3 | 3级 | 2 |
4 | 4级 | 2 |
5 | 5级 | 3 |
6 | 5级2 | 3 |
getChildLst(3,2) 应该返回的结果是:$,1,2,可实际报数据太长,真不明白,又无法测试,求解!
@梦在旅途: 这个就要慢慢试验了。。用print打印变量出来。
sTemp VARCHAR(5000)你这个定义的才5000,超过了sTemp的长度
我表的数据内容如下:
ID Name ParendId
1 | 一级 | 0 |
2 | 2级 | 1 |
3 | 3级 | 2 |
4 | 4级 | 2 |
5 | 5级 | 3 |
6 | 5级2 | 3 |
getChildLst(3,2) 应该返回的结果是:$,1,2,可实际报数据太长,真不明白,又无法测试,求解!
@梦在旅途: 直接在数据库调试下,把你定义的那几个变量的值打出来下
已解决,谢谢你的回复!
谢谢让我意识到是死循环,我这里的问题是我的父节点id是-1,现在改成0就可以了