3

階層構造のオブジェクトのテーブルがあるとします。

A
|--B
|--C
|  +--D
+--E

したがって、これらは「親子」テーブルに格納されます。

parent  child
A       B
A       C
C       D
A       E

これをクエリして、上記で定義された構造を取得するにはどうすればよいですか?私はこのような情報を生み出す何かが必要だと思います:

object  full_path
A       NULL
B       A
C       A
D       A.C
E       A

複数のレベルの深さでネストされたオブジェクトを実行する方法がわかりません。テーブルを反復処理する必要があるように感じます(SQLでこれが可能かどうかはわかりません)。そうでなければ、これまでに遭遇したことのない種類のクエリを使用する必要があります。

追加情報:

  1. 唯一の孤立したオブジェクトである必要はありません。
  2. 子供には複数の親がいる可能性がありますが、今のところ、どちらのシナリオでも解決しやすい答えに満足しています。GROUP BY単純なMINステートメントを使用して、複数の親の構造を単一の親に変換することを順守できます。
4

5 に答える 5

4

他の答えは正しいです、mysqlには再帰的な機能はありません。このリンクは、mysqlの階層にアプローチする方法を説明しています:http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

私は他の2つのSOの質問へのリンクを見つけました:結果が完全であるかどうかをテストするMySQLループ結合を行う方法は?およびMySqlの階層データ

于 2012-09-11T18:40:53.693 に答える
0

mysqlは再帰関数をサポートしていないため、mysqlでそれを行うことはできませんが、無制限の深さが必要ない場合は、自己結合を使用してツリーを取得できます。それ以外の場合は、プログラミング言語で再帰関数が必要です。または、サブツリーの選択を容易にするネストされたセットを使用できます。

于 2012-09-07T14:24:12.137 に答える
0

MySQLは再帰クエリをサポートしていません。ただし、サブツリーのフェッチを簡素化するネストされたセットを使用できる場合。

于 2012-09-07T19:36:31.443 に答える
0

基本的にこれは機能しません!

ルートノードの定義が必要です。ちなみに、あなたの「ツリー」はあなたの階層の定義と一致しません。

これはより良いアプローチです:

parent  child
-       A
A       B
A       C
C       D
-       E

マイナスの親エントリはルートノードです。そして、これはあなたの木を反映しています。

SQLは階層クエリを提供しません。しかし、あなたはトリックを繰り返すことができます:

良い説明はここにあります:

ルートノードを見つけて、再帰を使用してテキストを連結しようとします。

ルートノードは次のようになります。

SELECT * FRON objects WHERE parent = '-'
于 2012-09-12T23:29:06.603 に答える
-1

uにキー(varchar)がある場合、muはそれでソートできます。キー値は次のようになります。

001
001.001
001.001.001
001.001.002
001.001.003
002
002.001
002.001
003
003.001
...
...
于 2012-09-05T11:26:42.140 に答える