mysql階層データトラバーサルおよび再帰クエリ
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
値:
この複雑なクエリは、クエリ自体の変数を使用します。これは、
<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 サイトの他の関連記事を参照してください。