Implementierungsmethode der rekursiven MySQL-Baumabfrage

Implementierungsmethode der rekursiven MySQL-Baumabfrage

Vorwort

Bei baumstrukturierten Daten in der Datenbank, wie z. B. Abteilungstabellen, müssen wir manchmal alle untergeordneten Abteilungen einer Abteilung oder alle übergeordneten Abteilungen einer Abteilung kennen. Zu diesem Zeitpunkt müssen wir eine rekursive MySQL-Abfrage verwenden

Ich migriere derzeit ein Projekt von Oracle nach MySQL. Dabei stieß ich auf einige Oracle-Funktionen, die MySQL nicht bietet. Daher musste ich die Funktionen anpassen oder einen Weg finden, die Funktionen für die Transformation zu ersetzen.

Rekursive Oracle-Abfrage

Wenn Oracle rekursive Abfragen implementiert, können Sie „start with ... connect by“ verwenden.

Die grundlegende Syntax zum Herstellen einer Verbindung durch rekursive Abfrage lautet:

Wähle 1 aus der Tabelle, beginne mit ..., verbinde nach vorheriger ID = pId

start with: gibt an, welcher Knoten der Stammknoten ist. Sie können ohne Einschränkung 1=1 schreiben. Um den Knoten mit der ID 123 als Stammknoten zu verwenden, schreiben Sie start with id =123

connect by: connect by ist erforderlich, start with kann in manchen Fällen weggelassen werden, oder start with 1=1 ohne Einschränkung

Prior: Das Schlüsselwort prior kann vor oder nach dem Gleichheitszeichen stehen und hat unterschiedliche Bedeutungen. Prior id = pid bedeutet beispielsweise, dass pid der Stammknoten dieses Datensatzes ist.

Weitere Einzelheiten finden Sie in einem Oracle-Blog, den ich zuvor geschrieben habe: https://www.jb51.net/article/156306.htm

Oracle-Implementierung

<select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="oracle">
 wähle einen eindeutigen u.unit_code,
 u.Einheitenname,
 u.unit_tel,
 u.para_einheitencode
 von lzcity_approve_unit_info u
 beginne mit 1 = 1
 <if test="unitCode != null und unitCode !=''">
 und u.unit_code = #{unitCode}
 </if>
 <if test="unitName!=null und unitName!=''">
 und u.unit_name wie '%'|| #{unitName} ||'%'
 </if>
 Verbinden durch vorherigen u.unit_code = u.para_unit_code
 und u.unit_code <>u.para_unit_code
 </Auswählen>

Rekursive MySQL-Abfrage

Im Folgenden wird hauptsächlich die Implementierung von MySQL vorgestellt. MySQL bietet keine ähnlichen Funktionen und kann daher nur über benutzerdefinierte Funktionen implementiert werden. Im Internet gibt es viele solcher Materialien, aber ich weiß nicht, welches davon ursprünglich ist. Dieser Blog ist gut geschrieben: https://www.jb51.net/database/201209/152513.html. Im Folgenden verwende ich auch die vom Autor bereitgestellte Methode, um meine eigene zu implementieren. Vielen Dank an den Autor für das Teilen.

Hier verwenden wir die vom Autor bereitgestellte benutzerdefinierte Funktion sowie die Find_in_set-Funktion find_in_set(u.unit_code,getunitChildList(#{unitCode})) , wobei getunitChildList eine benutzerdefinierte Funktion ist

<select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="mysql">
 wähle einen eindeutigen u.unit_code,
  u.Einheitenname,
  u.unit_tel,
  u.para_einheitencode
  von t_unit_info u
  <wo>
  <if test="unitCode != null und unitCode !=''">
  und find_in_set(u.unit_code,getunitChildList(#{unitCode}))
  </if>
  <if test="unitName!=null und unitName!=''">
  und u.unit_name wie concat('%', #{unitName} ,'%')
  </if>
  </wo>
 </Auswählen>

Benutzerdefinierte Funktion „getUnitChildList“

TRENNUNGSZEICHEN $$

VERWENDEN Sie `gd_base`$$

DROP-FUNKTION, WENN EXISTIERT `getUnitChildList`$$

CREATE DEFINER=`root`@`%` FUNCTION `getUnitChildList`(rootId INT) GIBT VARCHAR(1000) CHARSET utf8 ZURÜCK
BEGINNEN
 DECLARE sChildList VARCHAR(1000);
 DECLARE sChildTemp VARCHAR(1000);
 SET sChildTemp = CAST(rootId AS CHAR);
 Solange sChildTemp nicht NULL ist,
 WENN (sChildList NICHT NULL IST) DANN
  SET sChildList = CONCAT(sChildList,',',sChildTemp);
 ANDERS
 SET sChildList = CONCAT(sChildTemp);
 ENDE, WENN;
 Wählen Sie Group_Concat (Einheitencode) in sChildTemp aus LZCITY_APPROVE_UNIT_INFO, wobei FIND_IN_SET (Paraeinheitencode, sChildTemp)>0;
 ENDE WÄHREND;
 Gibt die Kinderliste zurück.
ENDE$$

TRENNUNGSZEICHEN ;

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • So implementieren Sie eine baumartige Abfrage aller untergeordneten Knoten in MySQL
  • Einführung in die mehrstufige Strukturbaumsuche von MySQL
  • Spezifische Implementierung für untergeordnete Knoten und übergeordnete Knoten der rekursiven Abfragebaumtabelle von MySQL
  • MySQL-Abfragebaumstrukturmethode

<<:  CentOS 8-Installationsdiagramm (superdetailliertes Tutorial)

>>:  Detaillierte Erklärung des JS-Speicherplatzes

Artikel empfehlen

Die Auswirkungen des Limits auf die Abfrageleistung in MySQL

I. Einleitung Lassen Sie mich zunächst die MySQL-...

Zusammenfassung des Verständnisses des virtuellen DOM in Vue

Es handelt sich im Wesentlichen um ein allgemeine...

Überwachung sowie Betrieb und Wartung von Linux-Diensten

Inhaltsverzeichnis 1. Installieren Sie das psutil...

Ausführliche Erläuterung der Mysql-Deadlock-Anzeige und Deadlock-Entfernung

Vorwort Vor einiger Zeit ist bei mir ein MySQL-De...

Es ist ganz einfach zu verstehen, was Node.js ist

Inhaltsverzeichnis Offizielle Einführung in Node....

Detaillierte Erklärung des JavaScript ES6-Moduls

Inhaltsverzeichnis 0. Was ist ein Modul 1.Modul l...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.27 winx64

In diesem Artikel wird die Installations- und Kon...

So ändern Sie das ursprüngliche Passwort von MySQL auf dem MAC

Problembeschreibung: Ich habe einen Mac gekauft u...

Einführung in die Eigenschaften von B-Tree

B-Baum ist eine allgemeine Datenstruktur. Daneben...

Beginnen Sie CSS-Pseudoklassennamen nicht mit Zahlen

Wenn Neulinge Div+CSS entwickeln, müssen sie die ...

Implementierung der CommonJS-Modularität in Browsern ohne Kompilierung/Server

Inhaltsverzeichnis Einführung 1. Was ist one-clic...

Lernen Sie den Funktionsmechanismus von jsBridge in einem Artikel kennen

Inhaltsverzeichnis js aufrufende Methode Android ...

Detaillierte Erläuterung der Einführung in die JavaScript-Funktion

Inhaltsverzeichnis Funktionseinführung Funktion E...