遍历树形的层次结构,oracle中有现成的方法,mysql需要自己写函数或存储过程去实现。之前百度了后改了一下,发现递归查询后有的数据量很大,结果就报错了。不知道为什么。。表T_BASE_SITE :se_id    se_name   se_blseid(父网点) 函数:
DROP FUNCTION IF EXISTS getChildidList; 
CREATE FUNCTION getChildidList(rootId VARCHAR(32)) 
RETURNS text 
BEGIN
       DECLARE sTemp text;
       DECLARE sTempChd text;
    
 SET@@group_concat_max_len = 102400; 
       SET sTemp = '$';
       SET sTempChd =cast(rootId as char(10));
    
       WHILE sTempChd is not null DO
         SET sTemp = concat(sTemp,',',sTempChd);
         SELECT group_concat(se_id) INTO sTempChd 
 FROM t_base_site where FIND_IN_SET(SE_BLSEID ,sTempChd)>0;
       END WHILE;
       SET@@group_concat_max_len = 102400; 
 RETURN SUBSTRING(sTemp,3); 
     END程序中调用:select * from t_base_site where FIND_IN_SET(se_id, getChildLst(#{seBlseid}))现在对于数据量大的有报错,”Procedure execution failed
1406 - Data too long for column 'sTemp' at row 33“    
求教,什么问题

解决方案 »

  1.   


    msyql在开发方面的功能还有待完善,其他数据库oracle,sql server等都有 递归的功能
      

  2.   

    没有到255层,其实数据也不是很多,但报的错”Data too long for column 'sTemp' at row 33“  ,后来我改把变量sTemp由varchar(2000)改为text还是不行。  是的,,就是去查询所有子网点
      

  3.   


    如果数据多,比如现在输入1,然后所有其他记录都是1下面的子节点,所以 就会需要合并所有下级的id,如果你有2000个节点,那么字符串连接起来就会很长。另外,我觉得,一般情况下递归的层级不会太深,如果能达到8层就到极限了,像我们客户的一些组织架构也就这个层级,所以你可以引入一个新的字段,里面就是 0000001 这样的,组成一个字符串,到时候 直接like就可以,这是在 表的设计上做的修改。
      

  4.   


    我刚才写了一个递归的函数,也出现了 data too long for column的错误。之所以会出现这个错误,是因为死循环,一个很小的细节导致的问题你看看你的是不是死循环导致的
      

  5.   

    WHILE sTempChd is not null DO
    死循环吧
      

  6.   

    http://blog.csdn.net/acmain_chm/article/details/4142971
    MySQL中进行树状所有子节点的查询
    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点。但很遗憾,在MySQL的目前版本中还没有对应的功能。 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度是4, 那么所有节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现。 但很多时候我们...