単一の SQL クエリを使用して階層データベース内のすべての子フォルダーとサブ子フォルダーを取得する方法

Barbara Streisand
リリース: 2024-11-02 03:00:30
オリジナル
379 人が閲覧しました

How to Retrieve All Child and Subchild Folders in a Hierarchical Database using a Single SQL Query?

MySQL のすべての子フォルダーとサブ子フォルダーを取得するための再帰クエリ

質問:

方法階層データベース内の特定の親フォルダー ID のすべての子フォルダーとサブ子フォルダーを取得する単一の SQL クエリを設計できますか?

シナリオ:

次のようなテーブル フォルダーを考えます。次の構造:

CREATE TABLE IF NOT EXISTS `Folder` (
    `idFolder` INT(11) NOT NULL AUTO_INCREMENT,
    `FolderName` VARCHAR(150) NOT NULL,
    `idFolderParent` INT(11) NULL,
    PRIMARY KEY (`idFolder`),
    CONSTRAINT `fk_1`
    FOREIGN KEY (`idFolderParent`)
    REFERENCES `Folder` (`idFolder`)
);
ログイン後にコピー

テーブルは次のように設定されます:

idFolder FolderName idFolderParent
1 ADoc NULL
2 ADoc1 1
3 ADoc2 2
4 ADoc3 3
5 ADoc4 4
6 ADoc5 5
7 ADoc6 4

問題ステートメント:

クエリを設計したいと考えていますこれは、指定された親フォルダー ID のすべての子フォルダーとサブ子フォルダーを返します。例:

  • 親フォルダー ID 1 の場合、クエリは [2, 3, 4, 5, 6, 7] を返す必要があります。
  • 親フォルダー ID 4 の場合、クエリは[5, 7, 6] を返す必要があります。
  • 親フォルダー ID 3 の場合、クエリは [4, 5, 6, 7] を返す必要があります。

解決策:

次のクエリは、再帰的手法を使用して目的の結果を実現します。

<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>
ログイン後にコピー

説明:

  • クエリユーザー定義変数 @pv を使用して、現在のレベルの子フォルダ ID のカンマ区切りリストを保存します。
  • SELECT ステートメントのサブクエリは、現在のレベルの子フォルダ ID をカンマで区切って取得します。 .
  • 次に、外側のクエリはすべてのレベルの結果を連結し、指定された親のすべての子フォルダー ID とサブ子フォルダー ID のカンマ区切りのリストを提供します。

以上が単一の SQL クエリを使用して階層データベース内のすべての子フォルダーとサブ子フォルダーを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!