職場 (特に従来のプロジェクト) では、ツリー構造のクエリ (マルチレベル クエリ) というニーズによく遭遇します。一般的なシナリオには、組織構造 (ユーザー部門) のクエリと複数のクエリが含まれます。 -level menu query
たとえば、メニューは、第 1 レベルのメニュー、第 2 レベルのメニュー、第 3 レベルのメニューの 3 つのレベルに分かれており、ユーザーは、次のとおりにすべてのレベルのメニューをクエリする必要があります。ツリー構造。次の図に示すように、
3 レベルのクエリ プロセス: 第 3 レベルのツリーをクエリし、第 2 レベルのツリーをクエリします。第 3 レベルのツリーのparent_id に従って、同じ方法で第 1 レベルのツリーをクエリすると、バックエンドはツリー データを組み立ててフロントエンドに返します。 マルチレベルクエリ (レベルが固定されていない/レベルが非常に深い)この場合、最初に考えられるのはサブクエリまたはジョイントテーブルクエリですが、実際にはそうではありません。理由は誰もが知っています: SQL ステートメントは複雑でエラーが発生しやすいです#固定レベルと少数のレベル (通常は 3 レベル) の場合、要件の実装は非常に簡単です。最初に最小値をクエリします。子レベルから順に上位レベルにクエリを実行し、最後にアセンブルしてフロントエンドに返します。
次に問題は、レベルの数が 10 レベルと非常に多い場合、またはレベルが単純に不確実である場合 (3 レベル、5 レベル、8 レベルなど) で、レベルは固定されており、レベルの数は前と同じです。明らかに問題はより複雑です。これをツリー テーブルと呼びましょう:
CREATE TABLE tree ( id int not null auto_increment, name varchar(50) not null comment '名称', parent_id int not null default 0 comment '父级id', level int not null default 1 comment '层级,从1开始', created datetime, modified datetime );
CREATE TABLE tree_depth ( id int not null auto_increment, root_id int not null default 0 comment '根节点(祖先节点)id', tree_id int not null default 0 comment '当前节点id', depth int not null default 0 comment '深度(当前节点 tree_id 到 根节点 root_id 的深度)', created datetime );テーブルの深さフィールドは、現在のノードが位置するブランチ全体の深さではなく、現在のノードtree_idからルートノードroot_idまでの深さを表します。それ自体に対するすべてのノードの深さです。 is 0
treeN の id 値に従って、tree_ Depth テーブルはそのルート ノード ID をクエリします。
# クエリ Tree_ Depth テーブル データから ##select * from Tree where id in (?,?,?)
以上がMySql マルチレベル メニュー クエリを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。