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

単一の再帰クエリを使用して MySQL テーブル内のすべての親レコードを検索するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-06 18:59:12402ブラウズ

How Can I Find All Parent Records in a MySQL Table Using a Single Recursive Query?

再帰を使用した MySQL テーブル内の親の検索

データベース スキーマでは、階層関係を確立するのが一般的です。このようなデータをクエリする場合、特定のレコードだけでなく、その階層的な接続も取得する必要があります。この記事では、単一のクエリを使用して MySQL テーブル内のレコードのすべての親を検索するタスクについて説明します。

問題ステートメント

列 ID、TITLE を持つテーブルが指定された場合、CONTROLLER、METHOD、および PARENT_ID は、単一の SQL を使用して、TITLE が「カテゴリ」であるレコードのすべての親を検索します。 query.

必要な出力

出力には次が表示されます。列:

  • id
  • タイトル
  • コントローラ
  • メソッド
  • url
  • parent_id

そして、 records:

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

Solution

目的の出力を実現するには、MySQL の再帰クエリ機能を活用する必要があります。使用できる SQL クエリは次のとおりです:

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;

このクエリを分析してみましょう:

  • 内部クエリ (SELECT @r AS _id, ...) は、次の階層を生成します。 PARENT_ID を再帰的に選択し、レベルをインクリメントすることでレコードを取得します。
  • 外部クエリ (SELECT T2.id, ...) が結合します。元のテーブル メニュー (T2 に名前変更) を使用した内部クエリを実行して、目的のデータを取得します。
  • ORDER BY 句は、結果をレベルごとに降順に並べ替えます。

これを実行すると、クエリを実行すると、1 回のデータベース呼び出しで、TITLE を「カテゴリ」として持つレコードのすべての親を取得できます。

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

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