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

Konvertieren Sie ausgeschnittene PSD-Bilder in das Div+CSS-Format

Beispiel für das Zuschneiden einer Webseite von P...

So verhindern Sie doppelte Übermittlungen in einem JQuery-Projekt

In neuen Projekten kann Axios doppelte Übermittlu...

So verwenden Sie DQL-Befehle zum Abfragen von Daten in MySQL

In diesem Artikel zeigt Ihnen der Blogger die häu...

Softwaretests – MySQL (VI: Datenbankfunktionen)

1.MySQL-Funktionen 1. Mathematische Funktionen PI...

So stellen Sie MySQL so ein, dass die Groß-/Kleinschreibung nicht beachtet wird

MySQL auf Groß-/Kleinschreibung eingestellt Windo...

Lösung für den Konfigurationsfehler des Nginx-SSL-Zertifikats

1. Einleitung Wenn ein Webprojekt auf unserem Lin...

Verschiedene Möglichkeiten zum Ändern der Hintergrundbildfarbe mit CSS3

CSS3 kann die Farbe von Bildern ändern. Ab sofort...

Detailliertes Beispiel für MySQL ähnlich dem Schreiben von Oracle Rownum

Rownum ist eine einzigartige Schreibmethode in Or...

So bereinigen Sie Ihre Docker-Daten vollständig

Inhaltsverzeichnis Regelmäßig beschneiden Spiegel...

Warum brauchen wir Map, wenn wir in JavaScript bereits Object haben?

Inhaltsverzeichnis 1. Behandeln Sie Objekte nicht...

Eine kurze Analyse der Verwendung von watchEffect in Vue3

Vorwort Jeder sollte mit der Watch-API in vue2 ve...

Detaillierte Erklärung der Verwendung von SetUp- und Reactive-Funktionen in Vue3

1. Wann soll setUp ausgeführt werden? Wir alle wi...