求教 一个关于数据库算法的问题

PCD 2003-08-18 04:30:08
现有一张递归表:
每个元组有三个属性:自己本身的ID,名称,双亲的ParentID,一个元组的ID可能是其他多条元组的ParentID,以此类推,构成递归表,从数据结构角度看,构成了一棵树,其中也有若干元组是树的叶子…
已知条件:知道这棵树的唯一根接点的ID,求这棵树共有多少层?

哪位高手能给个大体的思路。。。
说的可能有点不清楚,不清楚的地方你们可以再问我,谢谢。。。
...全文
19 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxf_1976 2003-08-19
  • 打赏
  • 举报
回复
另:

楼主自己也说了,数据结构是一棵树,树节点的属性最好添加一个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语句实现
lxf_1976 2003-08-19
  • 打赏
  • 举报
回复
对叶子再进行提取优化:
select t1.id from test1 t1 left join test1 t2 on t1.id=t2.pid where t2.pid is null group by t1.pid;

把同一个父节点下的所有叶子只选一个
lxf_1976 2003-08-19
  • 打赏
  • 举报
回复
提供一种思路:

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,得出最大值就是结果了
PCD 2003-08-19
  • 打赏
  • 举报
回复
我也知道在加一个属性,问题会变的简单的多,但现在我是想添加新功能,这个时候来修改数据库好象不太现实,所以才……呵呵
lxf_1976 2003-08-19
  • 打赏
  • 举报
回复
同意挂月!

我的理解是:按楼主的需求,其实就是求每个节点的level的最大值,所以不如在元组中添加表示level的属性!
bluemeteor 2003-08-18
  • 打赏
  • 举报
回复
算法倒是可以写出来,但是需要遍历一遍,每遍历到一个节点都要select 一次,CPU会累劈的

如果楼主有求层的需求,那么把你的元组中在加入一个level的属性,每次有新的叶ID生成那么他的level值直接取parentID的level值++,这样想求层数可以用select max(level)的办法

同时也可以有group by level等诸多好处,所以........呵呵
jxbicestare 2003-08-18
  • 打赏
  • 举报
回复
学习

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧