ホームページ > データベース > mysql チュートリアル > MySQL 再帰クエリはどのようにして特定の子ノードのすべての祖先を効率的に取得できるのでしょうか?

MySQL 再帰クエリはどのようにして特定の子ノードのすべての祖先を効率的に取得できるのでしょうか?

DDD
リリース: 2024-12-07 02:20:13
オリジナル
845 人が閲覧しました

How Can MySQL Recursive Queries Efficiently Retrieve All Ancestors of a Given Child Node?

MySQL の階層クエリ: 祖先関係の取得

階層データを効果的に管理するために、MySQL は任意の深さの関係をナビゲートできる強力な再帰クエリを提供します。 。これは、祖先関係を抽出する必要がある場合に特に役立ちます。

次のリレーショナル構造を考えてみましょう。ここで、「a」は親フィールドを表し、「b」は子フィールドを表します。

| a  | b  |
-----------
| 1  | 2  |
| 2  | 3  |
| 3  | 4  |
| 4  | 5  |
| 3  | 6  |
| 4  | 7  |
ログイン後にコピー

問題: 子フィールドの値 (例: 5) を指定すると、関係なく、その親フィールド、祖父母などをすべて決定します。

解決策:

MySQL は、階層関係を効率的にナビゲートできる再帰的な Common Table Expression (CTE) を提供します。

WITH RECURSIVE Ancestors AS (
    SELECT  *
    FROM    mytable
    WHERE   b = 5
    UNION ALL
    SELECT  t1.*
    FROM    mytable t1
    JOIN    Ancestors t2 ON t1.a = t2.b
)
SELECT  a, b
FROM    Ancestors;
ログイン後にコピー

このクエリは、「Ancestors」という名前の再帰的 CTE を作成し、反復的に識別します階層内の各子フィールドの親。 CTE は、値 5 (つまり 5) を持つ子フィールドを選択することから始まります。次に、「a」(親) フィールドと「b」(子) フィールドを使用して、「mytable」をそれ自体に結合します。この再帰的なプロセスは、取得する親フィールドがなくなるまで続きます。

最後の SELECT ステートメントは、'Ancestors' CTE から 'a' (親) フィールドと 'b' (子) フィールドの両方を抽出し、

実行すると、このクエリは次の結果を返します:

a  | b
-----------
1  | 2
2  | 3
3  | 4
4  | 5
ログイン後にコピー

したがって、指定された子フィールド値の親、祖父母、さらに先祖を正常に取得します。

以上がMySQL 再帰クエリはどのようにして特定の子ノードのすべての祖先を効率的に取得できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート