ホームページ > データベース > mysql チュートリアル > 単一のクエリを使用して、MySQL 階層テーブル内のノードのすべての祖先を検索するにはどうすればよいですか?

単一のクエリを使用して、MySQL 階層テーブル内のノードのすべての祖先を検索するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-26 18:29:11
オリジナル
419 人が閲覧しました

How Can I Find All Ancestors of a Node in a MySQL Hierarchical Table Using a Single Query?

再帰 CTE を使用した 1 つのクエリで MySQL テーブル内のすべての親を検索

階層構造を持つデータベース内で親を識別する特定のレコードの処理は複雑なタスクになる可能性があります。 MySQL では、再帰共通テーブル式 (CTE) を使用してこの課題に効率的に対処できます。問題ステートメントとその解決策を見てみましょう。

問題ステートメント:

階層構造 (提供されたスキーマ内のテーブルなど) を持つ MySQL テーブルがあるとします。各行は、ID、タイトル、親 ID、その他の関連情報を持つノードを表します。タスクは、階層内の特定のノードのすべての祖先 (親) を取得することです。

解決策:

提供されたソリューションは、再帰 CTE を利用して階層を横断し、ID で指定されたノードの親を識別します。次のクエリは、このアプローチを示しています。

SELECT T2.id, T2.title, T2.controller, T2.method, T2.url
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 31, @l := 0) vars,
        menu m
    WHERE @r <> 0) T1
JOIN menu T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC;
ログイン後にコピー

クエリの説明:

  • サブクエリは、2 つのユーザー定義変数 @r と @l を初期化します。 ID 31 の指定されたレコードを選択します (それがターゲット ノードであると仮定します)。これらの変数は、再帰的反復中に現在のノード ID (@r) とレベル (@l) を追跡するために使用されます。
  • CTE の再帰部分は、現在のノードの親 ID を繰り返しフェッチし、レベルをインクリメントします。 。このプロセスは、現在のノードに親がなくなる (つまり、@r が 0 になる) まで続きます。
  • 外部クエリは、_id (レコード ID) に基づいて再帰的 CTE をメイン テーブル (メニュー) に結合し、
  • ORDER BY 句は結果をレベルの降順に並べ替えて、祖先を階層的に表示します。 order.

このクエリは、単一の SQL ステートメントで指定されたノードのすべての親を効率的に取得し、MySQL の階層データをナビゲートするための便利でパフォーマンスの高いソリューションを提供します。

以上が単一のクエリを使用して、MySQL 階層テーブル内のノードのすべての祖先を検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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