2012-02-01 15 views
4

私はリレーショナルデータベースにテーブルを持っています。このテーブルでは、Materialized pathというテクニックを使用してツリーをエンコードしますリネージュ列と呼ばれます)。つまり、ツリー内の各ノードについて、テーブルに行があり、各行に対して、ancestryという名前の文字列があります。ここでは、ルートノードからこの行で表されるノードまでのパスを格納します。ツリーをエンコードするマテリアライズドパスを使用するテーブルから深度優先順(再帰/ ltreeなし)

は、それが可能であり、そうならば - に行きがけでorderdテーブル内の行を選択する方法、つまり、彼らは木depth-firstを訪問してしまうために、結果セットに表示されます。私はMySQLを使用しているので、は再帰的クエリがなく、ltree拡張子はではありません。

例えば、木は、それがテーブルだし、行きがけ順て選択:

1  SELECT * FROM nodes SELECT * FROM nodes ORDER BY ?depth_first_visit_order? 
| \  id | ancestry   id | ancestry 
2 3  -------------   ------------- 
| | \ 1 | NULL    1 | NULL   NOTE: I don't care about the 
4 5 6 2 | 1    2 | 1     order of siblings! 
    |  3 | 1    4 | 1/2 
    7  4 | 1/2    3 | 1 
      5 | 1/3    5 | 1/3 
      6 | 1/3    7 | 1/3/5 
      7 | 1/3/5   6 | 1/3 

注:私は、マテリアライズドパスのエンコーディングを介してこれを行うには、明示的に興味を持っています!
関連:これはあなたの「祖先」の最後の数で

select *, 
Substring(ancestry,LEN(ancestry) - Charindex('/',Reverse(ancestry))+2, LEN(ancestry)) as END_CHAR 
from nodes 
order by END_CHAR desc 

を注文しますWhat are the options for storing hierarchical data in a relational database?

+0

同様のhttp://stackoverflow.com/questions/2797720/sorting-tree-with-a-materialized-path – clyfe

答えて

1

をintにキャストしなければならないことが大きな数字にしようとしませんでした私はあなたが望むものがアルファベット順であると信じています。

SELECT id, ancestry, ancestry + '/' + CAST(id as nvarchar(10)) AS PathEnumeration 
FROM nodes 
ORDER BY 3 ASC; 

MySQLがどのように連結されているかは覚えていませんが、私の意味ははっきりしています。それはアルファベットの一種であることを

1 
1/2 
1/2/4 
1/3 
1/3/5 
1/3/5/7 
1/3/6 

注ので、11はあなたが兄弟の順序を気にしていないと述べ、2。の前に現れしかします。私はもちろん、ネストされたセットとしてそれを書き換えるだろう;)

+1

私はおそらく、短い木がたくさんあるので、それをネストされたセットとして書き直します。私のデータは、すでに自然にコード化された "マテリアライズされたパス"です(正確なa.b.cとなるドメイン名)。一般的なケースではまだ動作していないと私はしばらく考えています。 – clyfe

0

私は9、あなたが

+0

申し訳ありません、これは実現しませんあなたの質問に答える、私はそれを誤解した。 質問を残して、それはあなたにいくつかのアイデアを与えるかもしれません。 – Diego

関連する問題