問題タブ [mptt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
6 に答える
20910 参照

.net - 親/子のフラット リストから階層オブジェクトを構築する

階層内にアイテムのリストがあり、このリストを解析してオブジェクトの実際の階層にしようとしています。このリストを保存/反復するために、変更された事前注文ツリー トラバーサルを使用しているため、すべての子を含むツリーのサブセットが「左」の値で並べられています。

たとえば、次のツリーがあるとします。

  • アイテムA
    • アイテムA.1
    • アイテムA.2
      • アイテムA.2.2
  • アイテムB
    • 項目 B.1
  • アイテムC

リストを取得します:

  • アイテムA、アイテムA.1、アイテムA.2、アイテムA.2.2、アイテムB、アイテムB.1、アイテムC

(これは、変更された予約注文ツリーの設定の「左」の値の順です)。

私がやりたいことは、これをツリーの実際の構造を含むオブジェクトに解析することです。

フラット リストは TreeObjects のリストとして返され、各 TreeObject には ID、ParentID、Left、Right のプロパティがあります。私が探しているのは関数です:

フラットリストを受け取り、ネストされたリストを返します。

言い換えると:

私はこれを行う方法に途方に暮れています-親を追跡し、より大きなジャンプに対処できるようにします(たとえば、アイテムA.2.2->アイテムB)。


編集:ここでは、ブルートフォース以外のソリューションを探しています(たとえば、トップレベルの親だけが残るまで、アイテムを子ノードに移動したり、数回ループしたりしません)。一度ループして、必要に応じてアイテムを配置できるエレガントな方法があると思います。

覚えておいてください、それらは常に階層的な順序になっているため (私は MPTT を使用しているため)、特定のアイテムは常に前のアイテムの子または兄弟になるか、少なくとも前のアイテムと親を共有します。ツリーの他の場所に来ることは決してありません。

0 投票する
2 に答える
2456 参照

python - django mptt の使用に関する問題

django mptt の実装に問題があります。

これが私のモデルです:

だから私が見ているのは、財務を子として会社に追加する方法です。mptt.register(Financials, parent = Company)もちろん、エラーが発生することを試しました。

したがって、mytree 構造は次のようになります。

ありがとう

0 投票する
6 に答える
4895 参照

sql - ネストされたセットのブレッドクラムを見つける

グループのリストを保存するために、ネストされたセット (別名、変更されたプレオーダー ツリー トラバーサル) を使用しています。すべてのグループのブレッドクラムを (テーブルではなく文字列として) 一度に生成する簡単な方法を見つけようとしています。私のデータも、隣接リスト モデルを使用して保存されます (2 つの同期を維持するためのトリガーがあります)。

たとえば、次のようになります。

これはツリーを表します:

  • ノード A
    • ノード B
      • ノード C
    • ノード D
      • ノード E
      • ノード F

テーブルを返すユーザー定義関数を使用できるようにしたいと思います。


これをもう少し複雑にするために (質問の範囲外ですが)、尊重する必要があるユーザー制限もあります。たとえば、id=3 にしかアクセスできない場合、クエリを実行すると次のようになります。

ユーザーIDをパラメーターとして受け取り、有効なすべてのグループのIDを含むテーブルを返すユーザー定義関数があります。クエリのどこかに限り

それが動作します。


これを実行できる既存のスカラー関数がありますが、妥当な数のグループでは機能しません (2000 グループで 10 秒以上かかります)。グループ ID とユーザー ID をパラメーターとして取り、nvarchar を返します。指定されたグループの親を検索し (左/右の値を取得するための 1 つのクエリ、親を検索するための別のクエリ)、ユーザーがアクセスできるグループにリストを制限します (上記と同じ WHERE 句を使用するため、さらに別のクエリを使用します)。次に、カーソルを使用して各グループを調べ、それを文字列に追加してから、最終的にその値を返します。

これを行うには、その場ですばやく (たとえば、<= 1 秒) 実行されるメソッドが必要です。

これは SQL Server 2005 上にあります。

0 投票する
2 に答える
2732 参照

php - この MPTT 配列を PHP のツリー構造に変換する方法は?

データベースに階層データがあり、Modified Preorder Tree Traversal形式で保存されています。Left「SELECT ID, , Right, Name, etc FROM Table ORDER BY Left;」のようなクエリでデータを取得しています。このデータを、DB が提供するフラットな配列からツリー構造に変換しようとしています。これを、PHP の json_encode 関数を使用して JSON として出力します。

ただし、ツリー構造のコードが最初のレベルを超えて機能するのに問題があります。最小のテスト ケースは次のとおりです。

そして、これが私が出力のために得ているものです:

ご覧のとおり、projectListToTree 関数の出力はそこにあるはずだと示しているように見えますが、どこかで「孫」が失われています。私が投げたツリー構造は、2 番目のレベルより下に何かをドロップするようです。何が起こっているのかについての洞察はありますか?

ありがとう!

0 投票する
1 に答える
1519 参照

php - MPTT 結果セットを多次元配列 PHP にソートする

Modified Pre-Order Tree Traversal Pattern を試してみました。テスト ケース コードは期待どおりの結果を返していますが、2D 配列を多次元配列に変換して表示するのに問題があります。

これは 3 レベルのメニュー結果の例です。TAL で反復できるように、これを多次元配列に変換する必要があります。

すべての親が繰り返される配列の配列である「子」キーを持つようにデータを構造化する必要があります。親/子/孫が持つことができる子の数に制限はありません。 DBMS であるため、配列の構造を変更するだけです。

ポインターは大歓迎です。usort() と array_walk_recursive を試してみましたが、役に立ちませんでした。

前もって感謝します

0 投票する
1 に答える
861 参照

mysql - MPTT 結果セットのアイテムを並べ替えていますか?

MPTT (変更されたプレオーダー ツリー トラバーサル) モデルを使用して、MySQL テーブルに階層データを格納しています。(MPTT モデル: 別の説明は入れ子集合モデルです。)。私の質問は次のとおりです。ツリーでクエリの結果をソートする賢い方法を見つけた人はいますか? 「ORDER BY label」に進むこともできますが、結果セットは、ノードの場所やツリー内の深さに関係なく、ラベルでソートされます。

以下は、任意のノードのツリーを各ノードの深さで取得するために使用するクエリの例です。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/に従って。

もちろん、これは常に、ネストされたセット内の位置によってアイテムを並べ替えます。'lastName' や 'accountBalance' や 'town' などで注文したい場合はどうすればよいでしょうか? それは MySQL で実行できますか? それとも、スクリプト言語で結果をソートする必要があると思いますか?

0 投票する
2 に答える
491 参照

sql - MPTT テーブルの推奨インデックス

Modified Pre-order Tree Traversal (MPTT) を使用して、階層データを格納するテーブルを作成しているところです。ご存知のように、各ノードはleftrightID を格納して、その子孫を見つけます。私は CakePHP が推奨するモデルを使用しています。これは、parent_id各行に を含めることで標準的な方法とは異なります。

推奨されるテーブル構造は次のとおりです。

これまでこのスタイルを使用したことがなく、どのように検索されるかを正確に知らなかったので、どのフィールドにインデックスを付けるべきか疑問に思っています。主キーだけで十分ですか、それとも主キーも含める必要がlftありrghtますか?

0 投票する
1 に答える
5181 参照

php - CakePHP ツリーでサブツリーを見つける

CakePHP では、どのactsAsツリーのモデルのサブツリーだけをどのように選択しますか?

これを試して、アイテムが先頭にあるツリーを見つけましたlabel = "My Label"

...しかし、ログを見ると、次の SQL が実行されます。

これは明らかに 1 つのノードのみを選択し、そのすべての子を選択するわけではありません。

0 投票する
2 に答える
2164 参照

php - PHP での MPTT (Modified Preorder Tree Traversal) の問題

初めての投稿はこちら!これは賢明になる場所のようです;)

私は現在、PHPの助けを借りてMysqlデータベースにデータを保存するためのMPTT(Modified Preorder Tree Traversal)アプローチを試す初めての試みで、いくつかのテストの最中です。

ただし、特定の親を持つ特定のレベルのすべてのリスト要素を取得するための最もパフォーマンス指向の方法を見つけようとしています。

入力した親の名前が「Bilar」の場合、下の画像から Saab と Chrysler のカテゴリを取得することになります。(これは、スウェーデン語で車を意味します。それがあなたの最強の側面ではない場合;))

画像を投稿できないので、フローチャートへのリンクを次に示します。 http://www.phpsidan.nu/files/mptt/mptt1.png

現在、私はやりたいことをするために2つのクエリを実行しており、レベルを計算して同じレベルの他のすべての要素を吐き出すためのかなりの量のコードを実行しています。

これを行うためのより良い方法はありますか?うまくいけば1つのクエリのみを使用することでしょうか?

どうもありがとう!

0 投票する
1 に答える
4334 参照

django - Django treebeard AL、NS、MPの違いは何ですか

オブジェクトを分類するためのモデルを作成しようとしています。

私はすでに django-mptt を使用して関連するカテゴリを簡単に取得しようとしましたが、現在、さまざまなソリューションを検索して最適なものを見つけています。

具体化されたパス、隣接リスト、およびネストされたセットの主な違いは何ですか。ウィキペディアは短い答えをくれませんでした。私が知っているのは、おそらく mptt がネストされたセットであるということだけです...

誰かが私にそれを一言で説明できますか?