MySQL での階層子データの取得: マルチレベル再帰選択
データベース クエリの領域では、即時データだけでなく抽出することが必要になることがよくあります。子データだけでなく、複数レベルの子孫情報も含まれます。これは、組織図やネストされたディレクトリ システムなどの階層構造に特に関係します。
ファイル ディレクトリをモデル化する Folder という名前のデータベース テーブルを考えてみましょう。各フォルダーには一意の ID、名前、およびオプションの親フォルダー ID があります。私たちの最終的な目標は、特定の親フォルダー ID を指定して、そのすべての子フォルダー、サブ子フォルダーなどを取得できるクエリを考案し、包括的な階層ビューを効果的に提供することです。
クエリ分析
提供されたクエリは、MySQL の GROUP_CONCAT() 関数を利用して階層情報を集約します。ネストされた SELECT ステートメントを使用して、カンマ区切りのリストで ID を連結することにより、すべての子フォルダーを繰り返し取得します。次に、このリストは変数 lv に保存され、子の追加レベルを段階的に識別するためのフィルターとして使用されます。
最も外側の SELECT ステートメントは、反復ごとに子 ID の連結リストを単純にグループ化し、それらをカンマとして提示します。区切られた文字列。 FIND_IN_SET() 関数を利用することで、クエリは、以前に識別された子 ID のセット内で各子が検索されることを保証します。
実行
データセットの例を考えてみましょう。
idFolder | FolderName | idFolderParent |
---|---|---|
1 | ADoc | NULL |
2 | ADoc1 | 7 |
3 | ADoc2 | 2 |
4 | ADoc3 | 3 |
5 | ADoc4 | NULL |
6 | ADoc5 | 5 |
7 | ADoc6 | 5 |
親フォルダー ID 5 のすべての子フォルダーとその子孫を取得するには、次のクエリを実行します。
<code class="sql">SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM ( SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder WHERE FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder JOIN (SELECT @pv:=5) tmp ) a;</code>
結果は、すべての子フォルダーとその子孫のカンマ区切りリストになります。サブ子 ID:
6,7,2,3,4
結論
提供されたクエリは、MySQL で階層的な子データを取得するための堅牢なソリューションを提供し、フォルダー構造とそのフォルダー構造の包括的なビューを提供します。入れ子になった関係。データベース構造を変更したり、親子関係の事前定義された順序に依存したりすることなく、階層を効果的に横断します。このソリューションは、複雑な階層データ構造を管理する場合に特に有用であることがわかります。
以上がMySQL を使用して階層構造内のすべての子孫を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。