【问题标题】:Get all leaf elemnts of a tree using mysql使用mysql获取树的所有叶子元素
【发布时间】:2013-12-19 12:39:50
【问题描述】:

这是我在这个博客上的第一篇文章,请帮助我

我正在尝试从递归查询中获取所有最后一个元素,但是要花很多时间才能继续进行是否有更好的方法来做到这一点,而我正在做的是

假设我有一张这样的桌子

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,%'
) 

这对我有用

【问题讨论】:

  • 我会尝试在此表的任何记录中的 ParentId 列中获取 ID 不存在的所有元素(我希望你明白我想说的:P)。
  • 好吧,但是我想从特定级别获得结果,例如,如果我想获得具有 parentId = 2 的叶节点元素该怎么办

标签: mysql optimization recursion query-optimization


【解决方案1】:

在Mysql中你不能得到这种选择。

在 Oracle 中是可能的。

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

问候

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2015-10-01
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多