算法倒是可以写出来,但是需要遍历一遍,每遍历到一个节点都要select 一次,CPU会累劈的如果楼主有求层的需求,那么把你的元组中在加入一个level的属性,每次有新的叶ID生成那么他的level值直接取parentID的level值++,这样想求层数可以用select max(level)的办法同时也可以有group by level等诸多好处,所以........呵呵

解决方案 »

  1.   

    同意挂月!我的理解是:按楼主的需求,其实就是求每个节点的level的最大值,所以不如在元组中添加表示level的属性!
      

  2.   

    提供一种思路:1. 首先找到所有叶子,方法如下:
    select t1.id from test1 t1 left join test1 t2 on t1.id=t2.pid where t2.pid is null
    其中test1假设为你的表名,pid为parentid
    2. 再找到一种方法计算某个元组的level,即它处在第几层(我还没想好方法,呵呵)
    3. 计算所有叶子的level,得出最大值就是结果了
      

  3.   

    对叶子再进行提取优化:
    select t1.id from test1 t1 left join test1 t2 on t1.id=t2.pid where t2.pid is null group by t1.pid;把同一个父节点下的所有叶子只选一个
      

  4.   

    另:楼主自己也说了,数据结构是一棵树,树节点的属性最好添加一个level!不光你目前这个需求需要使用,挂月提到的按level还可以提供满足更多需求的功能!建议:创建另一个表(如果实在不想添加或更改原有结构的话,就当作临时表吧),包含id、parentid、level,然后对原数据计算每个元组的level,思路如下:
    1. 首先得到根节点的信息,并插入新表,level为1
    2. 设置变量nLevel=1
    while (1)
    {
      INSERT INTO new_table 
        SELECT old_table.id, old_table.parentid, nLevel+1 FROM old_table 
          LEFT JOIN new_table ON old_table.pid=new_table.id 
          WHERE new_table.level=nLevel
      
      if (上述插入SQL语句返回affected rows为0)
        break;  nLevel++;
    }以上所写的SQL语句需要mysql4.0版本以上,如果是老版本,可以根据这种思路每个循环使用多个SQL语句实现