ホームページ > データベース > mysql チュートリアル > MySQL ツリー構造内の子孫と祖先を効率的にクエリするにはどうすればよいですか?

MySQL ツリー構造内の子孫と祖先を効率的にクエリするにはどうすればよいですか?

DDD
リリース: 2025-01-06 18:24:10
オリジナル
372 人が閲覧しました

How Can I Efficiently Query Descendants and Ancestors in a MySQL Tree Structure?

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 サイトの他の関連記事を参照してください。

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