単一クエリ (再帰クエリ) による 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 サイトの他の関連記事を参照してください。