ホームページ > データベース > mysql チュートリアル > 単一の再帰クエリを使用して MySQL テーブル内のすべての親エントリを検索する方法

単一の再帰クエリを使用して MySQL テーブル内のすべての親エントリを検索する方法

DDD
リリース: 2024-11-30 19:23:15
オリジナル
201 人が閲覧しました

How to Find All Parent Entries in a MySQL Table Using a Single Recursive Query?

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

メニューやカテゴリなどのテーブルは、多くの場合、エントリが階層構造になっています。親子関係を通じて互いに関係します。このようなシナリオでは、特定のエントリのすべての親を取得することが、特に 1 つのクエリで取得しようとする場合に困難になる可能性があります。

メニュー エントリを含む次のスキーマを考えてみましょう。

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
|  4 |             Users |      admin |             users |         0 |
|  5 |          Settings |      admin |          settings |         0 |
|  6 |           Reports |      admin |           reports |         0 |
|  7 |              Help |      admin |              help |         0 |
|  8 |             Pages |    content |             pages |         2 |
|  9 |             Media |    content |             media |         2 |
| 10 |          Articles |    content |          articles |         2 |
| 11 |            Menues |    content |            menues |         2 |
| 12 |         Templates |    content |         templates |         2 |
| 13 |            Themes |    content |            themes |         2 |
| 14 |              Blog |    content |              blog |         2 |
| 15 |             Forum |    content |             forum |         2 |
| 16 |      Core Modules |    modules |       core_module |         3 |
| 17 |      User Modules |    modules |       user_module |         3 |
| 18 |         All Users |      users |         all_users |         4 |
| 19 |            Groups |      users |            groups |         4 |
| 20 |       Permissions |      users |       permissions |         4 |
| 21 | Import and Export |      users |     import_export |         4 |
| 22 |        Send Email |      users |         send_mail |         4 |
| 23 |     Login Records |      users |     login_records |         4 |
| 24 |  General Settings |   settings |  general_settings |         5 |
| 25 |    Email Settings |   settings |    email_settings |         5 |
| 26 |   Popular Content |    reports |   popular_content |         6 |
| 27 | Most Active Users |    reports | most_active_users |         6 |
| 28 |     Documentation |       help |     documentation |         7 |
| 29 |             About |       help |             about |         7 |
| 30 |          Products |   products |           product |        17 |
| 31 |        Categories | categories |          category |        17 |
ログイン後にコピー

目標は、単一のクエリを使用して、ID 31 (カテゴリ) のエントリのすべての親を検索することです。これを実現するには、再帰クエリを使用します。

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;
ログイン後にコピー

このクエリは、共通テーブル式 (CTE) を使用して、エントリの親を繰り返し取得します。 vars サブクエリは、現在のエントリの ID と再帰のレベルをそれぞれ表す変数 @r と @l を初期化します。次に、メイン サブクエリ T1 は再帰クエリを使用して、レベルを上げながら現在のエントリの親を検索します。

最後に、T1 CTE がメニュー テーブル T2 と結合され、それぞれの詳細が取得されます。親エントリ。 ORDER BY T1.lvl DESC 句は、結果をレベルの降順に並べ替え、最も近い親が最初に表示されるようにします。

この再帰クエリを使用すると、次の目的の出力を取得できます:

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート