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

深さを指定せずに MySQL ツリー構造内の子孫または祖先を効率的にクエリするにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-06 17:30:41
オリジナル
776 人が閲覧しました

How Can I Efficiently Query Descendants or Ancestors in a MySQL Tree Structure Without Specifying Depth?

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

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