如何查询具有多个根和过滤的嵌套集模型

时间:2009-11-20 21:27:08

标签: asp.net sql nested-sets

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

我指的是文章Managing Hierarchical Data in MySQL

通常,按顺序检索项目的查询是按左叶值的顺序,但是有多个根,你可以一个接一个地结束多个“left:1”,这样就打破了树。

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

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

  • 任务1(进行中)
    • 任务2(有效)
      • 任务3(有效)

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

1 个答案:

答案 0 :(得分:7)

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

 Root1 (1, 4)
   Node1 (2, 3)

 Root2 (5, 12)
   Node21 (6, 7)
   Node22 (8, 11)
     Node221 (9, 10) 

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

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

Task 1 (In progress) [greyed out, inactive]
 +Task 2 (Active)
  +Task 3 (Active)

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

Task1 -> Task 2 (Active)
 + Task 3 (Active)
Task1 -> Task 4 -> Task 6 (Active)
 + Task 7 (Active)