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 サイトの他の関連記事を参照してください。