MySQL でのツリー構造の再帰
階層データを扱う場合、多くの場合、ツリー内の特定のノードの子孫を取得する必要があります。構造。 MySQL のコンテキストでは、ある場所が別の場所の中に存在する可能性があり、レベルの数が増加するにつれてタスクはより複雑になります。
提供される PHP/MySQL クエリ:
$sql = "SELECT id FROM se_locations_services WHERE parent_locationid IN ( SELECT location_id FROM se_locations_parent WHERE parent_id = '$locationid' )";
効果的に指定された場所の直接の子孫を取得します。
ただし、深さに関係なくすべての子孫を取得するには、再帰的アプローチが必要です。 MySQL は再帰クエリをネイティブにサポートしていませんが、mysql.com からの以下のリンクにある包括的な記事で概要が説明されている洗練されたソリューションがあります:
[MySQL での階層データの管理](https://www.mysql.com/news) -and-events/mysql-perspectives/performance-tuning-json-mysql-for-hierarchical-data/)
この記事では、CTE を使用するオプションを含む、階層データを処理するためのさまざまなアプローチを紹介します (一般的なテーブル式) を使用して再帰を実装します:
WITH RECURSIVE descendants (id, parent_id) AS ( SELECT id, parent_id FROM locations UNION ALL SELECT l.id, l.parent_id FROM locations l JOIN descendants d ON l.parent_id = d.id ) SELECT DISTINCT id FROM descendants WHERE parent_id = $locationid;
UNION ALL 演算子を使用することで、CTE は子孫のリストを反復的に拡張し、MySQL が単一のクエリから完全な階層を取得できるようにします。
以上がMySQL でツリー構造を再帰的にたどるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。