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

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

Mary-Kate Olsen
リリース: 2025-01-25 15:52:14
オリジナル
325 人が閲覧しました

How to Efficiently Navigate Hierarchical Data with Recursive Queries in MySQL?

mysql階層データトラバーサルおよび再帰クエリ

MySQLデータベースで階層構造データを処理する場合、さまざまなレベルのレベルのさまざまなレベルでデータを通過および取得するのは難しい場合があります。この記事では、MySQLで再帰クエリを作成する包括的な方法を紹介し、最新のバージョンと遺物のソリューションを提供します。

mysql 8.0の再帰クエリ

MySQL 8.0は、強力な

文法を導入し、シンプルで効率的な再帰クエリを書くことができます。たとえば、WITH RECURSIVE

このクエリでは、指定された
<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
  INNER JOIN cte ON cte.id = p.parent_id
)
SELECT * FROM cte;</code>
ログイン後にコピー
テーブルから

の名前が付けられているcte(CTE)という名前の公開式(CTE)は、指定されたproducts(ここ19)から始まり、そのすべてのサブノードを取得します。 parent_id

mysql 5.x再帰クエリ

MySQL 8.0の前に、直接再帰クエリはサポートされていませんでした。ただし、2つの代替方法を使用できます 変数の値

値:

この複雑なクエリは、クエリ自体の変数を使用します。これは、に従ってサブノードを認識します(この例19で)。ただし、この方法には、大規模なデータセットでパフォーマンスの問題がある場合があります。

<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>
ログイン後にコピー
パス​​スタイリング識別子:

parent_id パススタイル識別子を備えたツリーID構造は、再帰クエリを簡素化できます。たとえば、

この方法により、引き出しを使用して効率的に移動することができます。

要約

MySQLの再帰クエリの方法は、使用される特定のバージョンとデータセットに依存します。最新のMySQLバージョンの場合、

Grammarはエレガントで効率的なソリューションを提供します。残りのバージョンでは、上記の概要の代替方法を使用でき、そのパフォーマンスは異なります。
<code class="language-sql">CREATE TABLE products (id VARCHAR(255) PRIMARY KEY, name VARCHAR(255));
INSERT INTO products (id, name) VALUES ('19', 'category1');
INSERT INTO products (id, name) VALUES ('19/1', 'category2');
INSERT INTO products (id, name) VALUES ('19/1/1', 'category3');
INSERT INTO products (id, name) VALUES ('19/1/1/1', 'category4');</code>
ログイン後にコピー

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

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