MySQL での単一クエリ ツリー構造のクエリ
SQL では、ツリー構造は多くの場合、ID、データ、および親ID。特定の行のすべての子孫または祖先を取得することは、特に潜在的に未知の深さを考慮すると、困難な場合があります。
子孫のクエリ
特定の行のすべての子孫を取得するには、 Modified Preorder Tree Traversal と呼ばれる手法を使用できます。 Joe Celko が「Smarties のための SQL のツリーと階層」で説明しているように、このアプローチには、次の構造を持つ再帰共通テーブル式 (CTE) の作成が含まれます。
WITH RECURSIVE Descendants AS ( SELECT id, data, parent_id FROM tree_table WHERE id = <starting_row_id> UNION ALL SELECT t.id, t.data, t.parent_id FROM Descendants AS T JOIN tree_table t ON t.parent_id = T.id ) SELECT * FROM Descendants;
この CTE は、次の構造のすべての子行を再帰的に識別します。指定された開始行からリーフ ノードに到達するまで階層内を続行します。
クエリAncestors
特定の行のすべての祖先を取得するには、同様のアプローチを少し変更して使用できます。
WITH RECURSIVE Ancestors AS ( SELECT id, data, parent_id FROM tree_table WHERE id = <starting_row_id> UNION ALL SELECT t.id, t.data, t.parent_id FROM Ancestors AS T JOIN tree_table t ON t.id = T.parent_id ) SELECT * FROM Ancestors;
この CTE は、指定された開始点のすべての親行を再帰的に識別します。行に達し、ルート ノードに到達するまで階層を上向きに進みます。
例実装
PHP でのこれらのクエリの実際の例は、http://www.sitepoint.com/article/hierarchical-data-database/2/
にあります。以上がMySQL ツリー構造内の子孫と祖先を効率的にクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。