遍历树形的层次结构,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“
求教,什么问题
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“
求教,什么问题
msyql在开发方面的功能还有待完善,其他数据库oracle,sql server等都有 递归的功能
如果数据多,比如现在输入1,然后所有其他记录都是1下面的子节点,所以 就会需要合并所有下级的id,如果你有2000个节点,那么字符串连接起来就会很长。另外,我觉得,一般情况下递归的层级不会太深,如果能达到8层就到极限了,像我们客户的一些组织架构也就这个层级,所以你可以引入一个新的字段,里面就是 0000001 这样的,组成一个字符串,到时候 直接like就可以,这是在 表的设计上做的修改。
我刚才写了一个递归的函数,也出现了 data too long for column的错误。之所以会出现这个错误,是因为死循环,一个很小的细节导致的问题你看看你的是不是死循环导致的
死循环吧
MySQL中进行树状所有子节点的查询
在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点。但很遗憾,在MySQL的目前版本中还没有对应的功能。 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度是4, 那么所有节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现。 但很多时候我们...