MySQL-Rekursionsproblem

MySQL-Rekursionsproblem

MySQL selbst unterstützt keine rekursive Syntax, aber eine einfache Rekursion kann durch Selbstverbindung erreicht werden

--Rekursive Methode: Unterschiedliche Methoden für temporäre Tabellen und normale Tabellen--Diese Frage verwendet einen rekursiven „Drop Table if exists“-Test, um den übergeordneten Knoten mithilfe einer temporären Tabelle zweimal abzufragen.
Tabellentest erstellen(
Ich würde varchar(100),
Name varchar(20),
übergeordnete ID varchar(100)
);
Einfügen Test Auswahl
'13ed38f1-3c24-dd81-492f-673686dff0f3', 'Universitätslehrer', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' union alle auswählen 
'1ce203ac-ee34-b902-6c10-c806f0f52876','Grundschullehrer', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' Union alle auswählen 
'37e2ea0a-1c31-3412-455a-5e60b8395f7d', 'Lehrer', null Union alle auswählen 
'c877b7ea-4ed3-f472-9527-53e1618cb1dc', 'Lehrer für höhere Mathematik', '13ed38f1-3c24-dd81-492f-673686dff0f3' Union alle auswählen 
'ce50a471-2955-00fa-2fb7-198f6b45b1bd', 'Mittelschullehrer', '37e2ea0a-1c31-3412-455a-5e60b8395f7d';
 
Trennzeichen $$
 
Prozedur usp_ser erstellen (in idd varchar(100))
beginnen
deklariere lev int;
setze lev=1;
Tabelle löschen, falls tmp1 vorhanden ist;
Tabelle löschen, falls tmp2 vorhanden ist;
VORÜBERGEHENDE TABELLE ERSTELLEN tmp1(id varchar(100),name varchar(20),parentid varchar(100),levv int);
Temporäre Tabelle erstellen tmp2 (pid varchar (100));
füge tmp2 ein, wähle die übergeordnete ID aus dem Test aus, wobei ID = idd ist;
füge tmp1 ein, wähle t.*, lev von Test t, verbinde tmp2 a mit t.id=a.pid;
    solange existiert (wähle 1 aus tmp2)
Tun
tmp2 abschneiden;
setze lev=lev+1;
füge tmp2 ein, wähle t.id aus Test t, verbinde tmp1 a mit t.id=a.parentid und a.levv=lev-1;
füge tmp1 ein, wähle t.*,lev aus Test t, verbinde tmp2 a mit t.id=a.pid;
Ende während;
Wählen Sie ID, Name und übergeordnete ID aus tmp1.
Ende;
$$
 
Trennzeichen ;
 
 rufen Sie usp_ser auf ('c877b7ea-4ed3-f472-9527-53e1618cb1dc');
+--------------------------------------+----------+--------------------------------------+
| ID | Name | Eltern-ID |
+--------------------------------------+----------+--------------------------------------+
| 13ed38f1-3c24-dd81-492f-673686dff0f3 | Hochschullehrer | 37e2ea0a-1c31-3412-455a-5e60b8395f7d |
| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | Lehrer | NULL |
+--------------------------------------+----------+--------------------------------------+
 
 rufen Sie usp_ser('13ed38f1-3c24-dd81-492f-673686dff0f3') auf;
+--------------------------------------+------+----------+
| ID | Name | Eltern-ID |
+--------------------------------------+------+----------+
| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | Lehrer | NULL |
+--------------------------------------+------+----------+
 
 rufen Sie usp_ser('37e2ea0a-1c31-3412-455a-5e60b8395f7d') auf;
 
Leerer Satz (0,02 Sek.)

Die obige Methode verwendet zwei temporäre Tabellen, da MySQL nicht mehrere Verweise auf temporäre Tabellen in derselben Anweisung zulässt. Das Folgende ist eine rekursive Abfrage, die eine normale Tabelle verwendet, um untergeordnete Knoten einmal abzufragen.

Kerncode

Tabelle löschen, falls vorhanden, Test;
Tabellentest erstellen(
Ich würde INT,
übergeordnete ID INT
);
Einfügen Test Auswahl
1, 0 UNION ALLE AUSWÄHLEN 
2, 1 UNION ALLE AUSWÄHLEN 
3, 1 UNION ALLE AUSWÄHLEN 
4, 0 UNION ALLE AUSWÄHLEN 
5, 2 UNION ALLE AUSWÄHLEN 
6, 5 UNION ALLE AUSWÄHLEN 
7, 3 ;
Gehen
 
Trennzeichen $$
 
Prozedur usp_ser erstellen (in idd varchar(100))
beginnen
deklariere lev int;
setze lev=1;
Tabelle löschen, falls tmp1 vorhanden ist;
Tabelle erstellen tmp1 (ID INT, Parent-ID INT, Levv INT, Pfad VARCHAR (1000));

INSERT tmp1 SELECT *, lev, id FROM test WHERE parentid=idd;

 während row_count()>0
Tun

setze lev=lev+1;
füge tmp1 ein, wähle t.*,lev,concat(a.ppath,t.id) aus Test t, verbinde tmp1 a mit t.parentid=a.id UND levv=LEV-1;
 
Ende während;
WÄHLEN SIE * VON tmp1;
 
Ende;
$$
 
Trennzeichen ;
 
 rufe usp_ser(0) auf;
 
/*
+------+----------+------+-------+
| ID | übergeordnete ID | levv | pPfad |
+------+----------+------+-------+
| 1 | 0 | 1 | 1 |
| 4 | 0 | 1 | 4 |
| 2 | 1 | 2 | 12 |
| 3 | 1 | 2 | 13 |
| 5 | 2 | 3 | 125 |
| 7 | 3 | 3 | 137 |
| 6 | 5 | 4 | 1256 |
+------+----------+------+-------+*/

Das könnte Sie auch interessieren:
  • Spezifische Implementierung für untergeordnete Knoten und übergeordnete Knoten der rekursiven Abfragebaumtabelle von MySQL
  • So implementieren Sie rekursive Abfragen in MySQL
  • PHP+MySQL-Beispiel für unendliche Klassifizierung ohne Rekursion (nicht rekursiv)
  • Verwenden Sie Rekursion, um alle untergeordneten Knoten einer Baumstruktur zu löschen (implementiert von Java und MySQL).
  • Verwenden der Funktionsrekursion zur Implementierung eines dynamischen Baummenüs basierend auf PHP und MySQL
  • Ein Beispiel für die Verwendung der Java+MySQL-Rekursion zum Verketten baumförmiger JSON-Listen
  • Beispiel für eine rekursive PHP-Schreiboperation in MySQL zur Erzielung einer unbegrenzten Klassifizierungsebene
  • Implementierungsmethode der rekursiven MySQL-Baumabfrage

<<:  Zeichnen eines Feuerwerkseffekts von 2021 basierend auf JS mit Quellcode-Download

>>:  So erstellen Sie Ihr eigenes Image mit Dockerfile

Artikel empfehlen

Detaillierte Erklärung des Lebenszyklus von Angular-Komponenten (Teil 2)

Inhaltsverzeichnis 1. Haken anzeigen 1. Was bei d...

XHTML-Einführungstutorial: Webseitenkopf und DTD

Obwohl Kopf und DTD nicht auf der Seite angezeigt...

6 ungewöhnliche HTML-Tags

Zuerst: <abbr> oder <acronym> Diese be...

Einführung in die Verwendung des HTML-Elements Noscript

Noscript-Definition und -Verwendung Das Noscript-...

Front-End-JavaScript versteht Funktions-Currying gründlich

Inhaltsverzeichnis 1. Was ist Curry 2. Verwendung...

So verwenden Sie async await elegant in JS

Inhaltsverzeichnis $.ajax von jQuery Der Beginn d...

So implementieren Sie die Fernzugriffskontrolle in Centos 7.4

1. SSH-Remoteverwaltung SSH ist ein sicheres Kana...

Führen Sie die Schritte zum Aktivieren der GZIP-Komprimierung in Nginx aus.

Inhaltsverzeichnis Vorwort 1. Konfigurieren Sie d...

Hinweise zu Fallstricken bei Vuex und Pinia in Vue3

Inhaltsverzeichnis einführen Installation und Ver...

Zusammenfassung zur Verwendung von MySQL-Isolationsspalten und Präfixindizes

Inhaltsverzeichnis Datenspalten isolieren Präfixi...

Tutorial zur Verwendung von Docker Compose zum Erstellen von Confluence

Dieser Artikel verwendet die Lizenzvereinbarung „...

Details zum Like-Operator in MySQL

1. Einleitung Beim Filtern unbekannter oder teilw...

Linux verwendet NetworkManager, um Ihre MAC-Adresse zufällig zu generieren

Egal, ob Sie zu Hause auf dem Sofa oder draußen i...