Maison > Article > base de données > Comment implémenter une requête de menu à plusieurs niveaux MySql
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
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
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.
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 :
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
Interroger l'arborescence des nœudsN. depuis la table arborescenteselect * 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_idselect * from tree where id in (?,?,?)
select root_id from tree_degree où tree_id = #{treeId}
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!