4

同じテーブル内のツリーなど、複数のルートを持つネストされたセット モデルをどのようにクエリしますか? 現在、すべてのサブツリー ノードのルート ノードの ID を示す「ルート」と呼ばれる追加の列を追加しましたが、適切な順序でそれらを取得するための SQL がわかりません。

MySQL での階層データの管理という記事を参照しています。

通常、アイテムを順番に取得するクエリは、左の葉の値の順序ですが、複数のルートがあると、複数の「left:1」が次々と作成され、ツリーが壊れる可能性があります。

現在、SQL とはまったく関係のないソリューションを使用しています。C#コードでそれらを再配置しましたが、SQLでそれを行う方法があり、Webサーバーで費やした時間を節約できるかどうか疑問に思っています

最後の質問です。フィルターがあり、ツリーから一部のデータを除外する場合、どのように対処しますか?

言う

  • タスク 1 (進行中)
    • タスク 2 (アクティブ)
      • タスク 3 (アクティブ)

ステータスが「アクティブ」のすべてのツリーを表示するフィルタの場合、どうしますか?

4

1 に答える 1

7

「複数のルート」とは、最初のレベルから開始し、「真の」ルートを完全に省略していることを意味します。そう、

ルート 1 (1、4)
   ノード 1 (2、3)

 ルート 2 (5、12)
   ノード21 (6、7)
   ノード22 (8、11)
     ノード221 (9、10)

左右のインデックスでシーケンスを再開しないでください。あなたは傷ついた世界に足を踏み入れることになるでしょう。

フィルターの質問に関する限り、それは純粋にプレゼンテーションの問題です。これを処理するにはさまざまな方法があります。私が過去に使用したのは、フィルター基準を満たすノードにつながるパス内のすべてのノードを表示することでしたが、「フィルターで除外された」ノードを別の方法で強調表示し、それらをアクション不可にします (たとえば、UI で選択できず、操作は可能です)。それらに対して実行されないなど...)。何かのようなもの:

タスク 1 (進行中) [グレーアウト、非アクティブ]
 +タスク 2 (アクティブ)
  +タスク 3 (アクティブ)

もう 1 つの方法は、グリッド/ツリー コンボを使用してフィルター結果を表示することです。この場合、ノードへのパスはフラットに表示されますが、ノードの下のノード (存在する場合) はツリーとして表示されます。何かのようなもの:

タスク 1 -> タスク 2 (アクティブ)
 + タスク 3 (アクティブ)
タスク 1 -> タスク 4 -> タスク 6 (アクティブ)
 + タスク 7 (アクティブ)
于 2009-11-20T21:31:37.213 に答える