本人的函数定义如下:
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
解决方案:10分
direction为2的时候这个是个死循环啊。
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);
解决方案:10分
可以参考下贴中写法。
http://blog.csdn.net/acmain_chm/article/details/4142971
http://blog.csdn.net/acmain_chm/article/details/4142971
MySQL中进行树状全部子节点的查询
在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了全部当前节点下的全部子节点。但很遗憾,在MySQL的目前版本中还没有对应的功能。 在MySQL中假如是有限的层次,例如我们事先假如可以确定这个树的最大深度是4, 那么全部节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现。 但很多时候我们…