【问题标题】:Modified preorder tree traversal: Selecting nodes 1 level deep修改的前序树遍历:选择 1 级深的节点
【发布时间】:2011-12-01 11:49:24
【问题描述】:

我使用改进的前序树遍历算法保存了分层有序数据。

这是表格内容:

id  lft  rgt  name
1   1    10   topnode
2   2    3    level1
3   4    7    level1
4   5    6    level2
5   8    9    level1

可视化:

我想要的是只选择某个节点的子节点(而不是子节点的子节点)。让我们说'topnode'。我正在尝试修复一个查询,但我似乎无法理解它。

上网搜了一下,比如:我可以计算出每个节点的深度,但就是不能在上面选择。

这个查询

SELECT node.*, (COUNT(parent.id) - 1) AS depth
FROM tree AS node
CROSS JOIN tree AS parent
WHERE (node.lft BETWEEN parent.lft AND parent.rgt)
GROUP BY node.id
ORDER BY node.lft

显示每个节点的深度:

id  lft  rgt  name     depth
1   1    10   topnode  0
2   2    3    level1   1
3   4    7    level1   1
4   5    6    level2   2
5   8    9    level1   1

太好了,但我不能使用列深度作为条件!

【问题讨论】:

    标签: sql hierarchical-data modified-preorder-tree-t


    【解决方案1】:

    我认为这应该可以解决问题

    SELECT node.*, (COUNT(parent.id) - 1) AS depth
    FROM tree AS node
    CROSS JOIN tree AS parent
    WHERE (node.lft BETWEEN parent.lft AND parent.rgt)
    GROUP BY node.id
    HAVING depth = {{ENTER YOUR REQUIRED DEPTH HERE}}
    ORDER BY node.lft
    

    希望有帮助

    【讨论】:

    • +1 因为它可以工作,但我的 35000 节点树(8 秒)真的很慢。不能使用它:(
    • 你可以使用物化视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2016-07-14
    • 2011-02-10
    • 2013-01-12
    相关资源
    最近更新 更多