ホームページ  >  記事  >  データベース  >  MySql マルチレベル メニュー クエリを実装する方法

MySql マルチレベル メニュー クエリを実装する方法

王林
王林転載
2023-05-27 16:38:301506ブラウズ

背景

職場 (特に従来のプロジェクト) では、ツリー構造のクエリ (マルチレベル クエリ) というニーズによく遭遇します。一般的なシナリオには、組織構造 (ユーザー部門) のクエリと複数のクエリが含まれます。 -level menu query

たとえば、メニューは、第 1 レベルのメニュー、第 2 レベルのメニュー、第 3 レベルのメニューの 3 つのレベルに分かれており、ユーザーは、次のとおりにすべてのレベルのメニューをクエリする必要があります。ツリー構造。次の図に示すように、

MySql マルチレベル メニュー クエリを実装する方法

#固定レベルと少数のレベル (通常は 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
);
3 レベルのクエリ プロセス: 第 3 レベルのツリーをクエリし、第 2 レベルのツリーをクエリします。第 3 レベルのツリーのparent_id に従って、同じ方法で第 1 レベルのツリーをクエリすると、バックエンドはツリー データを組み立ててフロントエンドに返します。

マルチレベルクエリ (レベルが固定されていない/レベルが非常に深い)

この場合、最初に考えられるのはサブクエリまたはジョイントテーブルクエリですが、実際にはそうではありません。理由は誰もが知っています:

SQL ステートメントは複雑でエラーが発生しやすいです

  • パフォーマンスの問題はリーダーによって引き起こされる可能性があります

  • したがって、最良の方法は、テーブル Tree_ Depth を追加して、階層的な深さの関係を維持することです。

    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
ツリー深度テーブルを使用すると、N レベル ノードの組織データをクエリするのに便利です。

ツリー全体を走査します。

すべてのレベルを直接確認します =ツリー内の 1 つのノードを削除し、これらのノードのノードを削除します。id は、parent_id に基づいて下位ノードを検索します。すべてのノードをクエリした後、完全なツリー図に組み立ててフロントエンドに戻すことができます。

ノード検索(このノードが配置されているブランチ全体を検索します)

ツリー テーブルからノード ツリー N をクエリします

select * from Tree where id = N

  • treeN の id 値に従って、tree_ Depth テーブルはそのルート ノード ID をクエリします。

  • #root_id ブランチ データに基づいて、tree_ Depth の現在のノードをすべてクエリします。
  • 現在のノードのすべての Tree_id を取得します

    # クエリ Tree_ Depth テーブル データから ##select * from Tree where id in (?,?,?)

  • アセンブリが配置されているブランチ ツリー構造

以上がMySql マルチレベル メニュー クエリを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。