Maison  >  Article  >  base de données  >  Comment implémenter une requête de menu à plusieurs niveaux MySql

Comment implémenter une requête de menu à plusieurs niveaux MySql

王林
王林avant
2023-05-27 16:38:301506parcourir

Contexte

Nous rencontrons souvent ce besoin au travail (en particulier dans les projets traditionnels), qui est une requête de structure arborescente (requête à plusieurs niveaux). Les scénarios courants incluent : une requête de structure organisationnelle (service utilisateur) et une requête de menu à plusieurs niveaux

Pour. Par exemple, le menu est divisé en trois niveaux, un menu de premier niveau, un menu de deuxième niveau et un menu de troisième niveau. L'utilisateur doit interroger les menus à chaque niveau en fonction de la structure arborescente. Comme le montre la figure ci-dessous

Comment implémenter une requête de menu à plusieurs niveaux MySql

Pour les niveaux fixes et un petit nombre de niveaux, généralement 3 niveaux, l'exigence est très simple à mettre en œuvre. Interrogez d'abord le plus petit enfant, puis interrogez les niveaux supérieurs dans l'ordre, et enfin. assemblez-le et remettez-le à l’avant.

Ensuite, le problème survient, si le nombre de niveaux est très grand, 10 niveaux, ou simplement les niveaux sont incertains, certains sont à 3 niveaux, certains à 5 niveaux, certains à 8 niveaux, par rapport aux niveaux et nombres fixes précédents. niveaux, il y a évidemment un problème. C'est plus compliqué. Voyons comment gérer ce genre de

requête à trois niveaux (niveau fixe, petit nombre de niveaux)

Dans ce cas, nous n'avons besoin que d'une seule table. , appelons cela une table arborescente :

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
);

Le processus de requête de troisième niveau : interrogez l'arborescence de troisième niveau, interrogez l'arborescence de deuxième niveau en fonction du parent_id de l'arborescence de troisième niveau, puis interrogez l'arborescence de premier niveau. de la même manière. Le back-end assemble les données de l’arborescence et les renvoie au front-end.

Requête multi-niveaux (le niveau n'est pas fixe/le niveau est très profond)

Dans ce cas, la première chose à laquelle nous pensons est une sous-requête ou une requête de table commune, mais elle ne peut pas être utilisée dans le développement réel. raison :

  • Les instructions SQL sont complexes et sujettes aux erreurs

  • Les problèmes de performances peuvent être causés par les dirigeants

Le meilleur moyen est donc d'ajouter une table tree_degree pour maintenir la relation de profondeur hiérarchique.

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
);

Le champ de profondeur dans le tableau représente : la profondeur du nœud actuel tree_id au nœud racine root_id, et non la profondeur de la branche entière où se trouve le nœud actuel. La profondeur de tous les nœuds par rapport à lui-même est de 0

. Avec la table tree_degree, interrogez a. Il est pratique d'organiser les données des nœuds de niveau N :

Parcourez l'arbre entier :

Vérifiez directement tous les nœuds de niveau = 1 dans l'arborescence, puis vérifiez les nœuds de niveau inférieur en fonction du parent_id des identifiants de ces nœuds. Après avoir interrogé tous les nœuds, vous pouvez assembler un diagramme arborescent complet et le renvoyer au front-end

Recherche de nœuds (trouver la branche entière où se trouve ce nœud)

  • Interroger l'arborescence des nœudsN. depuis la table arborescente
    select * from tree which 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 (?,?,?)

  • Selon la valeur id de treeN, accédez à la table tree_degree pour interroger son identifiant de nœud racine :

    select root_id from tree_degree où tree_id = #{treeId}

🎜Requête tree_degree basée sur root_id Toutes les données de branche de nœud actuelles🎜select * from tree_owned où root_id = #{rootId}🎜🎜🎜🎜 Récupérez tous les nœuds actuels tree_id à partir des données de la table Tree_Profondeur de la requête🎜sélectionnez * dans l'arbre où se trouve l'identifiant dans (?,?,?)🎜🎜🎜🎜La structure arborescente de branche où se trouve l'assembly🎜🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer