1

MYSQL データベースに格納されたツリー状のデータ モデルがあります。ツリーは、各「ノード」オブジェクトで 2 つのフィールドを使用してトラバースされます。

  • ID
  • 親ID

ルート ID には「null」の parent_id があり、ツリー内の他のすべてのノードは親 ID を参照します。

このツリー内のすべてのノード ID のリストを取得したい場合は、ツリーを再帰的にトラバースし、各ノードの 1 つまたは複数の属性を収集する必要があります。基本的には多くのクエリを含む for ループを使用します。

SQLのクエリでこれをより効率的に行う方法があるかどうか疑問に思っていました

4

2 に答える 2

2

私が Closure Table と呼んでいるソリューションについて高評価の投稿を書きました:フラット テーブルをツリーに解析する最も効率的でエレガントな方法は何ですか?

その設計については、私のプレゼンテーション「Models for Hierarchical Data with SQL and PHP」と私の著書「SQL Antipatterns: Avoiding the Pitfalls of Database Programming 」でも取り上げています。

また、スタック オーバーフローで何度も階層データ クエリに関する質問に回答しました: https://stackoverflow.com/search?q=user%3A20860+%5Bhierarchical-data%5D

Quassnoiは、MySQL でのツリーのクエリに関する壮大な一連のブログ記事を書いています: http://explainextended.com/2009/07/22/hierarchial-queries-in-mysql-identifying-trees/

Quassnoi は、階層データに関するスタック オーバーフローに関する多くの質問にも回答しています: https://stackoverflow.com/search?q=user%3A55159+%5Bhierarchical-data%5D

于 2013-02-01T23:13:03.357 に答える
1

検索に難しいモデル、隣接リスト モデルを使用しています。親と子の関係の潜在的な「レベル」の数がわかっている場合は、そのためのクエリを作成できます。ただし、有限数でないとかなり大変です。

可能であれば、ネストされたセット モデルの使用を検討してください。この件に関する良い記事は次のとおりです。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

質問に戻ると、次のように、同じテーブルに複数回参加して、目的の結果を得る必要があります。

SELECT *
FROM YourTable t
    LEFT JOIN YourTable t2 ON t2.parentid = t1.id
    LEFT JOIN YourTable t3 ON t3.parentid = t2.id
    LEFT JOIN YourTable t4 ON t4.parentid = t3.id

潜在的な親子関係ごとに追加の JOIN を使用します。

これがお役に立てば幸いです。

于 2013-02-01T23:14:41.623 に答える