2

ネストされたセット モデル (左右の値) に格納された親子関係を持つ大きな mysql テーブルがあります。

特定のアイテムのすべての子を簡単に見つけることができます。

さて、特定のアイテムの深さを見つけるにはどうすればよいですか。

行の例:

Parent_ID、Taxon_ID、Taxon_Name、lft、rgt

somerow(taxon_id) の場合、ルートノードからの距離を知りたいです。

ここで、データを構造化する方法では、各ターミナル ノード (独自の子ノードを持たないノード) lft = rgt であることに注意することが重要です。オンラインに投稿された例の多くに rgt = lft +1 があることは知っていますが、簡単にするためにそうしないことにしました。

概要: ネストされたセット モデル。特定のノードの深さ (ルートに到達するノードの数) を見つける必要があります。

4

2 に答える 2

3

私はそれを考え出した。

基本的に、内部で探しているノードを含むすべてのノードを照会する必要があります。たとえば、lft=rgt=7330 を持つ 1 つのノードを見ていて、その深さが必要でした。私はちょうどする必要がありました

Select count(*) 
 from table 
 where lft<7330 
 AND   rgt>7330

実際のレベルではなく、前の世代の数を実際に示しているため、使用する前に結果に 1 を追加することをお勧めします。しかし、それは機能し、高速です!

于 2012-09-04T20:44:12.227 に答える
0

MySQL は再帰クエリをサポートしていません。PostgreSQL のサポートは限られていると思いますが、非効率的で面倒です。ただし、クエリを再帰的に (つまり、プログラム的に) 実行して目的の結果を得ることができない理由はありません。

「このノードの深さは?」はよくある質問ですが、各ノードがその深さを格納して維持できるように、テーブルのスキーマを調整することを検討してください。次に、厄介な再帰で計算する代わりに、その値を読み取ることができます。(テーブルをシャッフルしている場合、深さの値の維持は面倒になるかもしれませんが、読み取りよりもはるかに少ない書き込みを行うと仮定すると、これはより効率的なアプローチです。)

于 2012-09-04T19:18:23.387 に答える