>  기사  >  데이터 베이스  >  MySql 다단계 메뉴 쿼리를 구현하는 방법

MySql 다단계 메뉴 쿼리를 구현하는 방법

王林
王林앞으로
2023-05-27 16:38:301460검색

Background

우리는 직장에서(특히 전통적인 프로젝트에서) 트리 구조 쿼리(다단계 쿼리)라는 요구 사항을 자주 접합니다. 일반적인 시나리오에는 조직 구조(사용자 부서) 쿼리 및 다단계 메뉴 쿼리

For가 있습니다. 예를 들어, 메뉴는 1단계 메뉴, 2단계 메뉴, 3단계 메뉴 등 3단계로 구분되며, 사용자는 트리 구조에 따라 각 단계의 메뉴를 조회해야 합니다. 아래 그림과 같이

MySql 다단계 메뉴 쿼리를 구현하는 방법

고정된 수준과 적은 수의 수준(일반적으로 3개 수준)의 경우 요구 사항을 구현하는 것은 매우 간단합니다. 먼저 가장 작은 자식을 쿼리한 다음 상위 수준을 순차적으로 쿼리하고 마지막으로 조립해서 앞쪽으로 돌려보내세요.

그런 다음 문제가 발생합니다. 레벨 수가 매우 크거나 10레벨이거나 단순히 레벨이 불확실한 경우 이전 고정 레벨과 숫자에 비해 일부는 3레벨, 일부는 5레벨, 일부는 8레벨입니다. 분명히 문제가 있습니다. 더 복잡합니다. 이런 종류의

3단계 쿼리(고정 레벨, 적은 레벨 수)

이 경우에는 테이블이 하나만 필요합니다. , 트리 테이블이라고 부르자:

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단계 트리를 쿼리하고, 3단계 트리의 parent_id에 따라 2단계 트리를 쿼리한 다음, 1단계 트리를 쿼리합니다. 같은 방식으로 백엔드는 트리 데이터를 모아서 프런트엔드로 반환합니다.

다단계 쿼리(레벨이 고정되어 있지 않음/레벨이 매우 깊음)

이런 경우 가장 먼저 떠오르는 것이 서브 쿼리나 조인트 테이블 쿼리인데, 실제 개발에서는 사용할 수 없다는 것은 다들 아시죠. 이유:

  • SQL 문은 복잡하고 오류가 발생하기 쉽습니다

  • 성능 문제는 리더로 인해 발생할 수 있습니다.

따라서 가장 좋은 방법은 계층적 깊이 관계를 유지하기 위해 tree_length 테이블을 추가하는 것입니다.

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까지의 깊이를 나타냅니다. 자체를 기준으로 모든 노드의 깊이는 0

입니다. tree_뎁스 테이블을 이용하여 a를 질의하면 N레벨 노드의 데이터 정리가 편리하다:

전체 트리 탐색:

트리의 모든 레벨 = 1개 노드를 직접 확인한 후, 이를 기준으로 하위 레벨 노드를 확인한다. 모든 노드 ID의 parent_id를 쿼리한 후 완전한 트리 다이어그램을 조립하여 프런트 엔드로 반환할 수 있습니다.

노드 검색(이 노드가 있는 전체 분기 찾기)

  • 노드 트리N 쿼리 from the tree table
    select * from tree where id = N code><code>select * from tree where id = N

  • 根据 treeN 的 id 值,到 tree_depth 表查询出它的 根节点id:
    select root_id from tree_depth where tree_id = #{treeId}

  • 根据 root_id 查询 tree_depth 的 所有当前节点分支数据
    select * from tree_depth where root_id = #{rootId}

  • 从查询出 tree_depth 表数据中取出所有当前节点 tree_id
    select * from tree where id in (?,?,?)

  • treeN의 id 값에 따라 tree_length 테이블로 이동하여 루트 노드 ID를 쿼리합니다.

    root_id 선택 from tree_length where tree_id = #{treeId}

🎜root_id를 기준으로 tree_length 쿼리 모든 현재 노드 분기 데이터🎜select * from tree_length where root_id = #{rootId}🎜🎜🎜🎜 쿼리 tree_length 테이블 데이터에서 모든 현재 노드 tree_id를 검색합니다.🎜select * from tree where id in (?,?,?)🎜🎜🎜🎜어셈블리가 위치한 분기 트리 구조🎜🎜🎜

위 내용은 MySql 다단계 메뉴 쿼리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제