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

単一の再帰クエリを使用して MySQL テーブル内のレコードのすべての祖先を検索する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-08 07:31:11537ブラウズ

How to Find All Ancestors of a Record in a MySQL Table Using a Single Recursive Query?

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

サンプルを使用して次の MySQL テーブル スキーマを検討します。データ:

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
...

チャレンジ:

私たちの目標は、単一のレコードを使用して、特定のレコード、つまりタイトル = 'カテゴリ' を持つレコードのすべての親を見つけることです。 SQL クエリ。

必要出力:

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       

解決策:

再帰共通テーブル式 (CTE) を使用してテーブル階層を横断し、目的のテーブルのすべての祖先を識別します。レコード:

WITH RECURSIVE Parents AS (
    SELECT id, parent_id
    FROM menu
    WHERE id = 31
    UNION ALL
    SELECT m.id, m.parent_id
    FROM Parents AS p
    JOIN menu AS m ON p.parent_id = m.id
)
SELECT m.id, m.title, m.controller, m.method, m.url, m.parent_id
FROM Parents AS p
JOIN menu AS m ON p.id = m.id
ORDER BY p.id DESC;

説明:

  • CTE 親はターゲット レコードの ID (31) で初期化されます。
  • クエリの再帰部分は、現在のレコードのすべての親を選択し、 traversal.
  • ORDER BY 句は、直接の親が最初に表示されるように、結果を降順に並べ替えます。

このクエリを実行すると、目的の出力が得られ、すべての親がリストされます。カテゴリレコード。

以上が単一の再帰クエリを使用して MySQL テーブル内のレコードのすべての祖先を検索する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。