想用一个递归得到一个树,可是结果和想要的结构不一样,麻烦各位帮在下看看,万分感谢。
测试数据:
 CREATE TABLE `nodetbl` (                                 
           `nodeid` int(11) NOT NULL auto_increment,              
           `nodename` varchar(64) NOT NULL,                       
           `parentid` int(11) NOT NULL,                           
           `nodetype` int(11) NOT NULL,                                                           
           PRIMARY KEY  (`nodeid`)                                
         ) create table tmp_table(
               t_nodeId int(11),
               t_nodename varchar(64),
               t_nodetype int(11),
               t_nodelvl int(11),
               t_nodeson int(11)
)
insert into nodetbl values ('根区域',-1,0);
insert into nodetbl values ('7楼,1,0);
insert into nodetbl values ('test,2,1);
insert into nodetbl values ('zimu',1,1);想要得到的结果如下:
t_nodeId  t_nodename  t_nodetype  t_nodelvl  t_nodeson
1          根区域      0             1         2
2          7楼         0             2         1
3          test        1             3         0
4          zimu        1             2         0DELIMITER $$DROP PROCEDURE IF EXISTS `ehomedatabase`.`get_tree`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `get_tree`(paraId int,nodelvl int)
begin
declare t_id int(11);
declare t_Name varchar(64);
declare t_Type int(11);
declare t_sonsum int(11);
declare  cur_id CURSOR for
select nodeid,nodename,nodetype from nodetbl where parentid = paraId;
open cur_id;
fetch cur_id into t_id,t_Name,t_Type;
while(t_id is not null) do
select  count(1) into t_sonsum from nodetbl where parentid = t_id;
insert into tmp_table(t_nodeId,t_nodename,t_nodetype,t_nodelvl,t_nodeson) values (t_id,t_Name,t_Type,nodelvl,t_sonsum);
if t_sonsum > 0 then
call get_tree(t_id,nodelvl+1);
end if;
fetch cur_id into t_id,t_Name,t_Type;   //这个游标没有进行下去,所以得到的数据不正确
end while;
close cur_id;
    END$$DELIMITER ;

解决方案 »

  1.   

    select  count(1) into t_sonsum from nodetbl where parentid = t_id;
    检查是否有满足条件的记录
      

  2.   

    insert into nodetbl(nodename,parentid,nodetype) values ('根区域',-1,0);
    insert into nodetbl(nodename,parentid,nodetype) values ('7楼',1,0);
    insert into nodetbl(nodename,parentid,nodetype) values ('test',2,1);
    insert into nodetbl(nodename,parentid,nodetype) values ('zimu',1,1);
      

  3.   

    nodeid必须是1-4,如果删了再插会引起parentid的不对应,谢~~
      

  4.   

    你的程序并不合理啊,你最终的结果是想有多少条记录?你现在的是每遍历一次都写一次。 另外对    open cur_id;
        fetch cur_id into t_id,t_Name,t_Type;没有控制。
      

  5.   

    可以参考一下这个贴子http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/02/4142971.aspx
    MySQL中进行树状所有子节点的查询 
      

  6.   

    搞定了,少了一句话,declare CONTINUE HANDLER FOR SQLSTATE '02000' SET t_id = null; 
      

  7.   

    网上找了一下declare CONTINUE HANDLER FOR SQLSTATE '02000' SET t_id = null;这句话的意思,不是非常清楚,那位高手解释一下哦,谢谢~~
      

  8.   

    推荐这个 http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/02/4142971.aspx 相当不错,非常感谢~~
      

  9.   

    当出现错误SQLSTATE '02000' 的时候,就设置 t_id = null;MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html