4

私は家族を保存する必要があります(つまり、親のいくつかの子。それらの子には自分の子などがあります..)

そこで、次の構造を持つテーブルファミリーを作成しました

id 子 child_id 親_id

子を保存するときは、parent_id を一緒に保存します。

今、

特定の親のすべての子を取得したい場合は、簡単に行うことができます。

select child_id from family where parent_id = <given parent id>

しかし、

今、私は完全な家族(特定の親のすべての子孫)を取得したい

すなわち

特定のparent_idを持つすべての子+最初のクエリでフェッチされた子の子であるすべての子などを取得したい。

誰かが私を助けることができますか?

また、最初にデータを保存するためのより良い方法があるかもしれないので、後で取得できます。誰かがより良い方法を指摘できますか?

4

3 に答える 3

1

子とそのすべての依存関係をフェッチするクエリを作成できますが、最初にテーブル構造を再設計し、新しい子を追加するときにプロトコルを強制して、クエリが常に機能するようにする必要があります。

この方法を説明および説明しているこの非常に役立つ記事をご覧ください

于 2012-11-08T12:41:23.807 に答える
0

サブクエリを使用する

select GC.grandchildren,children from children C inner join grandchildren GC
  on C.childid=GC.id and
  C.childid in 
 (select child_id from family
  where parent_id = <given parent id>)
于 2012-11-08T12:11:11.697 に答える
0

テーブルの設計に関しては、列が冗長だと思います。child_id特定のノードのparent_idを設定して階層を構築し、ルートノードのparent_idを空のままにしておくことができます。

すべての子をトラバースするためのクエリに関しては、ここで提案されているようなアプローチを使用できます (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) が、従う必要があることを意味します。 ID にいくつかの規則を適用し、各ノードに「パス」を保存します。(ツリーの真ん中に何かを挿入する必要がある場合、これは複雑になります)

他のデータベース ブランドには、この問題に対する句があります (Oracle の場合、STARTS WITH ... CONNECT BY 句があります) が、いずれも ANSI ではありません。

それが役に立てば幸い

于 2012-11-08T13:02:04.193 に答える