ホームページ  >  記事  >  データベース  >  MySQL ツリー構造内のすべての子孫を再帰的に取得するにはどうすればよいですか?

MySQL ツリー構造内のすべての子孫を再帰的に取得するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-23 19:45:30509ブラウズ

How to Recursively Retrieve All Descendants in a MySQL Tree Structure?

MySQL でのツリー構造の再帰

データベース内の階層データの管理は困難な場合があります。一般的なアプローチの 1 つは、提供された質問に示されているように、親子関係を使用することです。直接の子孫のクエリは簡単ですが、すべての子孫を取得するのはより複雑になる可能性があります。

MySQL ドキュメントでは、次のような階層データを処理するためのいくつかの方法が提案されています。

  • パス列挙: このメソッドでは、各ノードからツリーのルートまでのパスをデータベース列に保存します。クエリでは、効率的な子孫の取得のためにこの列を使用できます。
  • 隣接リスト: このアプローチでは、親子関係が 1 つのテーブルに保存され、各行はノードとその直接の親を表します。実装は簡単ですが、すべての子孫を取得するには複数のクエリが必要です。
  • ネストされたセット: このより高度な方法では、列のペアを使用して、ノード内の各ノードの左右の位置を保存します。木。これにより効率的な子孫の取得が可能になりますが、より複雑なテーブルの更新が必要になります。

この例では、Path Enumeration メソッドを使用して、次のクエリは親の場所のすべての子孫を取得します。

WITH RECURSIVE descendant_path AS (
  SELECT id, path
  FROM locations
  WHERE id IN (SELECT location_id FROM location_parent WHERE parent_id = '$locationid')
  UNION ALL
  SELECT l.id, CONCAT(dp.path, ',', l.id)
  FROM locations l
  JOIN descendant_path dp ON l.path LIKE CONCAT(dp.path, '%')
)
SELECT id FROM descendant_path;

このクエリは、再帰的な CTE (共通テーブル式) を使用してツリー構造を反復処理し、子孫の場所ごとにパスを構築します。最初のクエリで開始位置を指定すると、すべての子孫を 1 回のパスで取得できます。

以上がMySQL ツリー構造内のすべての子孫を再帰的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。