【问题标题】:How to Query Nested Set model with multiple roots plus filtering如何查询具有多个根和过滤的嵌套集模型
【发布时间】:2009-11-20 21:27:07
【问题描述】:

如何查询具有多个根的嵌套集模型,例如同一张表中的树?目前,我添加了一个名为“Root”的额外列,指示所有子树节点的根节点的 ID,但是,我无法弄清楚 sql 以正确的顺序检索它们

我指的是文章Managing Hierarchical Data in MySQL

通常,按顺序检索项目的查询是按左叶值的顺序,但是如果有多个根,则可以一个接一个地得到多个“左:1”,这样会破坏树。

我目前正在使用与 SQL 完全无关的解决方案。我在我的 C# 代码中重新安排了它们,但我只是想知道是否有办法用 SQL 来完成它,这样可以节省我在 Web 服务器上花费的时间

最后一个问题。如果我有一个过滤器,它会从树中过滤掉一些数据,你如何处理它?

  • 任务 1(进行中)
    • 任务 2(活动)
      • 任务 3(活动)

如果过滤器要显示所有状态为“活动”的树,你会怎么做?

【问题讨论】:

    标签: asp.net sql nested-sets


    【解决方案1】:

    “多个根”只是意味着您从第一级开始并完全省略了“真正的”根。所以,

    根 1 (1, 4) 节点 1 (2, 3) 根 2 (5, 12) 节点 21 (6, 7) 节点 22 (8, 11) 节点 221 (9, 10)

    在左/右索引上重新启动序列;你会走进一个受伤的世界。

    就您的过滤问题而言,这纯粹是一个演示问题。有不同的方法来处理这个;我过去使用的一个是在通向满足您的过滤条件的节点的路径中显示 所有 节点,但以不同的方式突出“过滤掉”节点并使它们不可操作(例如不能在 UI 中选择,无法对其执行操作等...)。比如:

    任务 1(进行中)[灰显,不活动] +任务 2(主动) +任务 3(主动)

    另一种方法是使用网格/树组合来显示过滤结果,其中节点的路径显示为展平,但节点下的节点(如果有)显示为树。比如:

    任务 1 -> 任务 2(活动) + 任务 3(主动) 任务 1 -> 任务 4 -> 任务 6(活动) + 任务 7(主动)

    【讨论】:

    • ChssPly76!我真的很喜欢你对过滤器的看法,这很有意义!!!我从来没有这样想过。我认为可用性明智,您的第一种方法对非技术用户最有意义,我会按照您的建议做。非常感谢!关于您对多个根的方法,在进行选择时,效果很好,但是如果您在 node1(2,3) 下再添加两个新节点怎么办?所以它应该是 Node1 (1,8) ..Node1(2,7) ....Node1(3,4) ....Node1(5,6) 我们得到重复的值?
    • 不客气 :-) 我不太明白您所说的“重复”是什么意思 - 如果您要在 Node1 下添加另一个节点,那么 all大于父节点(例如 Node1)的左索引的左/右索引必须更改。不要认为这些“根”是完全独立的;这不是嵌套集合模型的设计方式。将它们视为一些“不可见的主节点”下的常规节点。所有操作(添加/移动/删除注释)仍然适用于并(可能)影响所有节点。
    • 再次感谢 ChssPly76。我的大脑没有早点恢复过来。我明白你现在在说什么。这个周末我终于可以完成了!
    猜你喜欢
    • 2017-02-03
    • 2017-07-15
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2015-10-14
    • 2021-06-07
    相关资源
    最近更新 更多