ホームページ >データベース >mysql チュートリアル >MySQL でツリー構造を再帰的にたどるにはどうすればよいですか?

MySQL でツリー構造を再帰的にたどるにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-24 04:59:02343ブラウズ

How to Recursively Traverse a Tree Structure in MySQL?

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

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