MySQL でのツリー構造のクエリ: 深さに依存しないトラバーサル
MySQL のツリー構造データへのアクセスには、再帰的クエリまたは順次クエリが含まれることがよくあります。ただし、単一のクエリを使用して深さレベルを明示的に指定しなくても、ツリー構造テーブル内の特定の行のすべての子孫または祖先を取得することは可能です。この手法は、変更されたプリオーダー ツリー トラバーサルとして知られています。
クエリ方法
列 id、data、parent_id を含むツリー構造テーブルでは、変更されたプリオーダー トラバーサル クエリで次のことができます。
SELECT id, data, parent_id FROM tree_table WHERE id IN ( SELECT id FROM tree_table WHERE ancestry LIKE '%given_id/%' )
ここで、given_id は、対象となる行の ID を表します。子孫または祖先を取得したい。
使用法と実装
クエリ文字列 'ancestry LIKE '%given_id/%'' は、指定された ID を持つ行をフィルタリングします。彼らの祖先の道の一部。これにより、すべての子孫が (指定された行とともに) 返されることが保証されます。先祖を取得するには、「%given_id/%」を「%/given_id/%」に置き換えるだけです。
たとえば、MySQLi を使用した PHP では次のようになります。
$stmt = $mysqli->prepare("SELECT id, data, parent_id FROM tree_table WHERE id IN (SELECT id FROM tree_table WHERE ancestry LIKE '%?/%')");
追加情報
Sitepoint から提供されている PHP の例 (回答で言及されている) は、これを包括的に示しています。テクニック。 SQL でのツリー構造の処理に関する詳細については、Joe Celko の「Trees and Hierarchies in SQL for Smarties」を参照してください。
以上が深さを指定せずに MySQL ツリー構造内の子孫または祖先を効率的にクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。