背景:
ファイル システムや組織図などの多くの階層データ構造では、親子関係に基づいてデータを取得する効率的な方法が必要です。 MySQL には、これらの構造を効率的に走査する再帰的クエリを作成する方法がいくつか用意されています。
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 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 のもう 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 サイトの他の関連記事を参照してください。