Heim  >  Artikel  >  Datenbank  >  So implementieren Sie eine mehrstufige MySql-Menüabfrage

So implementieren Sie eine mehrstufige MySql-Menüabfrage

王林
王林nach vorne
2023-05-27 16:38:301506Durchsuche

Hintergrund

Bei der Arbeit stoßen wir häufig auf diesen Bedarf (insbesondere in traditionellen Projekten), bei dem es sich um baumstrukturierte Abfragen (mehrstufige Abfragen) handelt. Zu den häufigsten Szenarien gehören: Organisationsstruktur (Benutzerabteilung). Abfrage und mehrstufige Menüabfrage

Zum Beispiel ist das Menü in drei Ebenen unterteilt: Menü der ersten Ebene, Menü der zweiten Ebene und Menü der dritten Ebene. Der Benutzer muss die Menüs abfragen auf allen Ebenen entsprechend der Baumstruktur. Wie in der Abbildung unten gezeigt

So implementieren Sie eine mehrstufige MySql-Menüabfrage

Für feste Ebenen und eine kleine Anzahl von Ebenen, im Allgemeinen 3 Ebenen, ist die Anforderung sehr einfach zu erfüllen Implementieren Sie zuerst die kleinste untergeordnete Ebene, fragen Sie dann nacheinander die obere Ebene ab und bauen Sie sie schließlich zusammen und geben Sie sie an das Frontend zurück.

Dann ist die Frage, ob die Anzahl der Ebenen sehr groß ist, 10 Ebenen, oder ob die Ebenen einfach unsicher sind, einige sind 3 Ebenen, einige sind 5 Ebenen, einige sind 8 Ebenen, sie sind festgelegt Bei den vorherigen Ebenen sind die Ebenen offensichtlich komplizierter. Schauen wir uns an, wie wir damit umgehen. In diesem Fall benötigen wir nur eine Tabelle, nennen wir sie eine Baumtabelle: #🎜 🎜#

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

Der Abfrageprozess der dritten Ebene: Fragen Sie den Baum der dritten Ebene ab und fragen Sie den Baum der zweiten Ebene basierend auf der parent_id des Baums der dritten Ebene ab abgefragt, und das Backend stellt die Baumdaten zusammen und gibt sie an das Frontend zurück.

Mehrstufige Abfrage (die Ebene ist nicht festgelegt/die Ebene ist sehr tief)

In diesem Fall denken wir zuerst an eine Unterabfrage oder eine gemeinsame Tabelle Abfrage, was aber in der Praxis nicht möglich ist. In der Entwicklung verwendet, kennt jeder den Grund:

SQL-Anweisungen sind komplex und fehleranfällig

    Leistungsprobleme, kann vom Leiter erledigt werden
  • Der beste Weg ist also, eine Tabelle „tree_ Depth“ hinzuzufügen, um die hierarchische Tiefenbeziehung aufrechtzuerhalten .
  • 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
    );

    Das Tiefenfeld in der Tabelle stellt Folgendes dar: die Tiefe vom aktuellen Knoten „tree_id“ bis zum Wurzelknoten „root_id“, nicht die Tiefe des gesamten Zweigs, in dem sich der aktuelle Knoten befindet. Die Tiefe aller Knoten relativ zu sich selbst ist 0

  • Mit der Tabelle „tree_ Depth“ ist es praktisch, die Organisationsdaten eines N-Level-Knotens abzufragen:

Den gesamten Baum durchqueren:

# 🎜🎜#Überprüfen Sie direkt alle Ebenen = 1 in den Baumknoten und überprüfen Sie dann die Knoten der unteren Ebene basierend auf der parent_id basierend auf den IDs dieser Knoten. Nachdem Sie alle Knoten abgefragt haben, können Sie ein vollständiges Baumdiagramm zusammenstellen und zurückgeben zum Frontend

Knotensuche (diesen Knoten finden Der gesamte Zweig, in dem er sich befindet)

Fragen Sie den KnotenbaumN aus der Baumtabelle ab

select * from tree where id = N#🎜🎜 #

Gehen Sie entsprechend dem ID-Wert von treeN zur Tabelle „tree_ Depth“, um eine Abfrage durchzuführen seine Wurzelknoten-ID:
    select root_id from tree_ Depth where tree_id = #{treeId} code><li><p><br><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 (?,?,?)Fragen Sie alle aktuellen Knotenzweigdaten von ab Baumtiefe basierend auf Root_ID

    wählen Sie * aus Baumtiefe aus, wobei Root_id = #{rootId}
  • Alle aktuellen Knotenbaum-IDs aus der Abfrage abrufen Baum_Tiefentabellendaten
  • wählen Sie * aus dem Baum aus, in dem sich die ID befindet (?,?,?)
#🎜🎜##🎜🎜##🎜🎜#Die Zweigbaumstruktur, in der die Baugruppe befindet sich#🎜🎜##🎜🎜##🎜🎜#

Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine mehrstufige MySql-Menüabfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen