ホームページ > データベース > mysql チュートリアル > 再帰クエリを使用してMySQLの階層データを効率的に取得するにはどうすればよいですか?

再帰クエリを使用してMySQLの階層データを効率的に取得するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-25 15:57:09
オリジナル
891 人が閲覧しました

How Can I Efficiently Retrieve Hierarchical Data in MySQL Using Recursive Queries?

MySQL 再帰クエリ: 階層データの効率的な処理

背景:

ファイル システムや組織図などの多くの階層データ構造では、親子関係に基づいてデータを取得する効率的な方法が必要です。 MySQL には、これらの構造を効率的に走査する再帰的クエリを作成する方法がいくつか用意されています。

MySQL 8 再帰構文ソリューション

MySQL 8 では、再帰的 WITH 構文が導入され、再帰的クエリが大幅に簡素化されています。

<code class="language-sql">WITH RECURSIVE cte (id, name, parent_id) AS (
  SELECT id, name, parent_id
  FROM products
  WHERE parent_id = 19
  UNION ALL
  SELECT p.id, p.name, p.parent_id
  FROM products p
  JOIN cte ON p.parent_id = cte.id
)
SELECT * FROM cte;</code>
ログイン後にコピー

parent_id = 19 内の値を、子を取得する親ノードの ID に置き換えるだけです。

MySQL 5.x パス ID ソリューション

MySQL 8 より前では、再帰クエリには他のメソッドが必要でした。 1 つのアプローチは、ID 列に階層情報を埋め込んでパス ID を割り当てることです。

たとえば、パス ID を含むテーブルは次のようになります:

ID NAME
19 category1
19/1 category2
19/1/1 category3
19/1/1/1 category4

ここで、次のクエリは category1 のすべての子ノードを取得します:

<code class="language-sql">SELECT * FROM products WHERE id LIKE '19%'</code>
ログイン後にコピー

MySQL 5.x インライン変数と自己結合ソリューション

MySQL 5.x のもう 1 つのオプションは、インライン変数、パス ID、または自己結合を使用して再帰的クエリを作成することです。以下はインライン変数の使用例です:

<code class="language-sql">SELECT id, name, parent_id
FROM (SELECT * FROM products
ORDER BY parent_id, id) products_sorted,
(SELECT @pv := '19') initialisation
WHERE FIND_IN_SET(parent_id, @pv)
AND LENGTH(@pv := CONCAT(@pv, ',', id))</code>
ログイン後にコピー

@pv := '19' の値を、子ノードを取得する親ノードの ID に設定します。

概要

MySQL には、階層データを処理する再帰クエリを作成する方法がいくつか用意されています。どの方法を選択するかは、使用している MySQL のバージョンとクエリの特定の要件によって異なります。

以上が再帰クエリを使用してMySQLの階層データを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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