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

単一のクエリを使用して、MySQL 階層内の特定のエントリのすべての親ノードを検索するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-30 11:54:18
オリジナル
346 人が閲覧しました

How Can I Find All Parent Nodes of a Specific Entry in a MySQL Hierarchy Using a Single Query?

単一クエリ (再帰クエリ) による MySQL テーブル内のすべての親の検索

データベース管理では、階層データを取得する際に、再帰アルゴリズムを含む複雑なクエリが必要になることがよくあります。このようなシナリオの 1 つは、上記のような階層テーブル内の特定のエントリのすべての親ノードを抽出する必要がある場合に発生します。

課題:

メニュー項目の階層を持つ提供されたテーブルを考えてみましょう。 、各ノードには ID、タイトル、親 ID があります。私たちの目標は、単一の MySQL クエリを使用して、「カテゴリ」というタイトルのエントリのすべての親ノードをフェッチすることです。

解決策:

再帰クエリを使用してテーブルを走査し、各レベルの親ノード。次のクエリはこれを実現します:

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 (現在のノードの ID) と @l (現在のノードのレベル) を初期化します。 ) 初期値はそれぞれ 31 (「カテゴリ」の ID) と 0 です。
  • 外側のクエリはテーブルを反復処理し、更新します。 @r に現在のノードの親 ID を指定し、@l を増分して現在のレベルを追跡します。
  • 外部クエリ (T1) の結果は、共通のクエリに基づいて元のテーブル (T2) と結合されます。 column_id.
  • 最後に、結果をlvlの降順にソートして、親ノードを階層的に表示します。 order.

出力:

クエリを実行すると、目的の出力が生成されます:

id title controller method url parent_id
3 Modules admin modules (NULL) 0
17 User Modules modules user_module (NULL) 3
31 Categories categories category (NULL) 17

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

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