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

Eine kurze Analyse der Verwendung der Zero-Copy-Technologie in Linux

In diesem Artikel werden mehrere wichtige Zero-Co...

Über die Kontrolle und Verschönerung von Eingabedateien

Beim Hochladen auf einigen Websites wird nach dem...

MySQL-Datenbank-Master-Slave-Replikation und Lese-/Schreibtrennung

Inhaltsverzeichnis 1. Master-Slave-Replikation Ma...

Tipps, wie Sie aus Pixeln umfassende Markenerlebnisse machen

Herausgeber: In diesem Artikel wird die Rolle erö...

Linux verwendet join -a1, um zwei Dateien zusammenzuführen

Um die folgenden beiden Dateien zusammenzuführen,...

Verwendung des Linux-Befehls gzip

1. Befehlseinführung Der Befehl gzip (GNU zip) wi...

Tiefgreifendes Verständnis der sieben Kommunikationsmethoden von Vue-Komponenten

Inhaltsverzeichnis 1. Requisiten/$emit Einführung...

Tiefgreifendes Verständnis der MySQL-Selbstverbindung und Join-Assoziation

1. MySQL-Selbstverbindung MySQL muss beim Abfrage...