1

ノードの直接の子が誰であるかだけを知りながら、ノードのすべてのリーフ ノード (子、孫など) を選択する MySQL クエリを作成するための非再帰的なソリューションを探しています。

現在、次のテーブルがあります。

ノード:

  • ID (INT)
  • データ (VARCHAR)

関係:

  • 親 ID (INT)
  • 子ID (INT)
  • childNodeOrder (INT)

私が現在持っている方法では、親ノードの直接の子ノードのみを選択できます (この例では、親 Id = 1 にします):

SELECT * FROM  Nodes n
JOIN Relationships r ON r.childId = n.id
WHERE r.parentId = 1
ORDER BY r.childNodeOrder;

このデータベースを簡単に変更して、(サーバー側のコードで) 再帰呼び出しを使用せず、親のすべての子孫の葉を取得できるようにする方法はありますか?

これまでのところ、根本的な変更のように思われるこのような質問を見てきましたが、切り替えるのは非常に簡単ではありません...

4

1 に答える 1

1

NESTED SET データ モデルを参照してください。おそらくここで役立つでしょう。

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

編集:より多くのコンテキストが必要なので、ここに詳細があります.

親ノードには、範囲 [左、右] をカバーする左属性と右属性があります。

すべての子ノードがその範囲に含まれるため、次のようになります。

親.左 <= 子.左 <= 子.右 <= 親.右.

すべての葉ノードの範囲は 1 であるため、左 + 1 = 右は葉のみです。

親からすべての葉を取得するには、次のような where 句を使用します。

WHERE (左 + 1 = 右) AND (左 >= 親.左) AND (右 <= 親.右)

于 2012-11-28T16:26:08.813 に答える