回答:
これらの再帰クエリは既知であるため、階層クエリはMySQLではサポートされていません。
ただし、Oracle、Microsoft SQL Server、DB2、PostgreSQLなどでサポートされています。
回避策が必要な場合は、動的な(したがって、潜在的に危険な)トリックをここで見つけることができます:https : //stackoverflow.com/questions/8104187/mysql-hierarchical-queries
隣接リスト(つまり、親列)以外のモデルで階層データを保存する方法については、https://stackoverflow.com/questions/192220/what-is-the-most-efficient-を参照してください。エレガントな方法でフラットテーブルにツリーを解析する/
幸運を!
このテーブルデザインは、ビルカーウィン(SQL Antipatterns Strike Backプレゼンテーションのスライド48から見た)によって説明されているSQLアンチパターン「単純なツリー」です。この設計の問題は、特に、ノードのすべての子孫(または親)を取得するのが難しいことです。MySQLを使用しているため、他のRDBMSに存在する一般的なテーブル式(WITHステートメントとそのRECURSIVE修飾子)は使用できません。
残っているのは:
深さ制限のある自己結合クエリを構築します。depth = 5の場合、次の行で何かを使用できます。
SELECT *
FROM comments AS c1
JOIN comments AS c2 ON (c2.parent_id = c1.id)
JOIN comments AS c3 ON (c3.parent_id = c2.id)
JOIN comments AS c4 ON (c4.parent_id = c3.id)
JOIN comments AS c5 ON (c5.parent_id = c4.id)
WITH RECURSIVEをサポートするRDBMSを使用します(ただし、これはほとんどの場合、オプションではありません)
MySQLは、必要なクエリなどの再帰クエリをサポートしていません。
私がしばらく前にやったことは、そうするためのモデルを提供するストアドプロシージャを書くことでした。
車輪を再発明するのではなく、これに関する私の過去の投稿へのリンクを提供します。
Oct 24, 2011
:階層型フィールドの最高レベルの検索:CTEありとなしDec 10, 2012
:MySQL:ツリー階層クエリApr 12, 2013
:mysqlの再帰クエリ要するに、私が作成したストアドプロシージャは、キュー処理を使用して先行予約ツリートラバーサルを実行します
GetParentIDByID
GetAncestry
GetFamilyTree
parent_id
キュー内でparent_id
を現行としてid
現在の値をparent_id
STEP02
id
キュー内でid
を現行としてparent_id
現在の値をid
STEP02
実装を確認するには、他の投稿のストアドプロシージャをご覧ください。
SELECT group_concat(@id :=
(
SELECT id
FROM comments
WHERE parent_id = @id
)) AS comment
FROM (
SELECT @id := 1
) vars
STRAIGHT_JOIN
comments
WHERE @id IS NOT NULL