使用mysql获取树的所有叶元素

时间:2013-05-07 10:37:30

标签: mysql optimization recursion query-optimization

这是我在这篇博客上的第一篇帖子,请帮帮我

我试图从递归查询中获取所有最后一个元素但是要花费很多时间才能继续进行更好的方法来执行此操作我正在做的是

假设我有一个类似

的表格
ID      ParentId
1       0
2       1
3       1
4       1
5       2
6       2
7       3
8       4

对于Id 1我希望获得5,6,7,8,因为你可以看到5,6,7,8的父母是1的孩子同样对于Id 2 o / p必须是5和6是否有最佳解决方案。我的意思是除了重复运行查询以获取子元素

之外的其他事情

我在MySQL中解决问题的方法是我添加了一个额外的字段“allParent”,其中包含当前类别的逗号分隔ID我的示例表现在本来就是

ID      ParentID      allParent
1       0             0
2       1             0,1
3       1             0,1
4       1             0,1
5       2             0,1,2
6       2             0,1,2
7       3             0,1,3
8       4             0,1,4

现在获取所有叶级实体的查询将是

Select * from table where (
    allParent LIKE '1,%' or 
    allParent LIKE ',1%' or 
    allParent LIKE '%,1,%'
) and ID NOT IN (
    Select ParentId from table where
    allParent LIKE '1,%' or 
    allParent LIKE ',1%' or 
    allParent LIKE '%,1,%'
) 

这为我工作

2 个答案:

答案 0 :(得分:0)

假设您使用的是MySQL,最好的办法是使用closure table。如果您使用的是其他数据库(例如:PostgreSQL),则可能会执行递归查询,从而允许数据库处理递归而不是代码。

答案 1 :(得分:0)

在Mysql中你无法获得这种选择。

在Oracle中是可能的。

在这种特定情况下执行此操作的唯一方法是将左连接嵌套为您拥有的级别数。

此致