4

この質問は、この投稿のフォローアップです。

フラットテーブルをツリーに解析するための最も効率的でエレガントな方法は何ですか?

ClosureMapソリューションが気に入りましたが、解決すべき追加の問題があります。

ツリー内の特定のノードへのパスを簡単に取得するにはどうすればよいですか?たとえば、提供されているツリーを見ると、次のようになります。

IDノード名

1'ノード
1'2 'ノード1.1'3
'
ノード2'4'ノード1.1.1'5'ノード2.1'6
'
ノード1.2'

1.1.1へのパスは次のようになります。

ID = 1、2、4

再帰SQL呼び出しを行わずに、パスを取得するための洗練された方法はありますか?

4

2 に答える 2

1
SELECT ancestor_id
FROM ClosureTable
WHERE descendant_id = 4;

値1、2、4を返します。ただし、これらは別々の行に返され、正しい順序であることを示すものではありません(番号順がツリー階層の順序に対応しているとは限りません)。

場合によっては、のすべてのパスの深さも保存しますClosureTable。ただし、そうでない場合でも、特定のノードにある祖先の数を数え、それを使用して並べ替えることができます。

SELECT ct1.ancestor_id, COUNT(*) AS depth
FROM ClosureTable ct1
 JOIN ClosureTable ct2 ON (ct1.ancestor_id = ct2.descendant_id)
WHERE ct1.descendant_id = 4
GROUP BY ct1.ancestor_id
ORDER BY depth;

はい、これでも3行の結果が返されます。MySQLを使用している場合は、にアクセスできますGROUP_CONCAT()。それ以外の場合は、3つの行をフェッチして、それらの値をアプリケーションコードに連結するのは簡単です。

于 2009-08-17T19:52:33.503 に答える
0

私は最善の解決策を見つけたと思いますが、それが私が参照した投稿にあることに本当に気づいていませんでした:)。

Site Pointには、Left/Right属性を使用して特定のノードを取得する方法を示す素晴らしい記事がありました。

http://www.sitepoint.com/article/hierarchical-data-database/2/

于 2009-08-17T20:03:16.210 に答える