ホームページ > データベース > mysql チュートリアル > MySQL の深さ優先検索は、どのようにして階層構造内のノードのすべての祖先を効果的に取得できるのでしょうか?

MySQL の深さ優先検索は、どのようにして階層構造内のノードのすべての祖先を効果的に取得できるのでしょうか?

Barbara Streisand
リリース: 2024-12-08 10:27:15
オリジナル
183 人が閲覧しました

How Can MySQL's Depth-First Search Effectively Retrieve All Ancestors of a Node in a Hierarchical Structure?

MySQL の階層クエリ: 深さ優先検索による祖先の走査

階層データ内の祖先関係の決定は、データベース管理の一般的なタスクです。 MySQL では、階層クエリを使用して、ネストされた構造に効率的に移動したり、そこからデータを取得したりできます。

階層的な親子を表す 2 つの列「a」と「b」を持つ「mytable」という名前のテーブルがあるとします。 relationship:

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

特定のノードのすべての祖先を取得するシナリオを考えてみましょう。たとえば、すべての祖先を検索します。ノード 5 の親、祖父母など。

ソリューション utilizzando l'algoritmo di Ricerca in profondità:

MySQL は、深さを使用した階層クエリ ソリューションを提供します。 - ファーストサーチ (DFS) アプローチ。これを実現するクエリは次のとおりです。

SELECT  @id :=
        (
        SELECT  senderid
        FROM    mytable
        WHERE   receiverid = @id
        ) AS person
FROM    (
        SELECT  @id := 5
        ) vars
STRAIGHT_JOIN
        mytable
WHERE   @id IS NOT NULL
ログイン後にコピー

分析:

  • ネストされたクエリは、'@id' 変数をノード (5) で初期化します。
  • 外側のクエリは、現在のクエリの直接の親を繰り返し取得します。 '@id' は、'mytable' の 'senderid' フィールドを使用します。
  • 'STRAIGHT_JOIN' により、親子関係をバイパスする可能性のある最適化を行わずに、クエリが階層に従うことが保証されます。
  • 「@id」変数は、反復ごとに親ノードの「senderid」で更新され、プロセスは、ノードがなくなるまで続行されます。 parents.

このクエリを実行すると、ノード 5 の祖先のリスト (4、3、2、および 1) が取得されます。このメソッドは、DFS アプローチを使用して階層を効果的に横断し、次のことを可能にします。 MySQL データベース内の複雑な親子構造をナビゲートします。

以上がMySQL の深さ優先検索は、どのようにして階層構造内のノードのすべての祖先を効果的に取得できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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