MySQL implementiert eine Funktion ähnlich der MySQL-Methode oder gespeicherten Prozedur connect_by_isleaf

MySQL implementiert eine Funktion ähnlich der MySQL-Methode oder gespeicherten Prozedur connect_by_isleaf

In letzter Zeit gibt es eine besonders ungewöhnliche Geschäftsnachfrage, es gibt einen Tisch

CREATE TABLE `demo` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `tid` int(11) STANDARD '0',
 `pid` int(11) STANDARD '1',
 PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3000124 DEFAULT CHARSET=utf8;

Das ist alles. Es gibt mehr als 3 Millionen Zeilen mit Datensätzen. Jede PID zeichnet die Kategorie der obersten Ebene dieser ID auf, und die TID ist ihre übergeordnete Kategorie!
Jetzt lautet die Anforderung: Finden Sie durch Angabe einer ID alle ihre Teilmengenmitglieder heraus und ändern Sie den Wert dieser PID auf den neu angegebenen Wert! !
Ich habe es in PHP ausgeführt und die Ausführung hat über 50 Sekunden gedauert, was echt nervig war! ! !
Es ist notwendig, alle Teilmengen rekursiv zu finden und ihre PIDs zu ändern, was viel Arbeit bedeutet.

Es gibt in Oracle eine Methode namens connect_by_isleaf, mit der alle Teilmengen problemlos gefunden werden können, aber ich verwende MySQL ...

Daher werde ich hier einfach über meine Erfahrungen mit der Verwendung von MySQL-Methoden oder gespeicherten Prozeduren zur Implementierung schreiben

Erstens: MySQL-Methode

CREATE DEFINER=`root`@`localhost` FUNCTION `lvtao_demo_a`(rootId int) GIBT Text CHARSET utf8 ZURÜCK
  Liest SQL-Daten
  KOMMENTAR 'Demo'
BEGINNEN

DECLARE sTemp-Text;
DECLARE sTempChd-Text;

SET sTempChd =cast(rootId als CHAR);
SETZEN Sie sTemp = '';

WHILE sTempChd ist nicht null DO
  SET sTemp = concat(sTemp,',',sTempChd);
  Wählen Sie group_concat(id) INTO sTempChd FROM demo, wobei FIND_IN_SET(tid, sTempChd)>0;
ENDE WÄHREND;

RÜCKGABE sTemp;

ENDE;

Die Verwendungsmethode ist

wähle lvtao_demo_a(5);

Aber als ich es getestet habe, sind die 3 Millionen Daten praktisch abgestürzt! ! !

Daten zu lang für Spalte „sTemp“ in Zeile 1

Vorteile: einfach, bequem, keine Begrenzung der Tiefe der rekursiven Aufrufebenen (max_sp_recursion_depth, maximal 255);
Nachteile: Begrenzte Länge.

Der zweite Typ: gespeicherte Prozedur + Zwischentabelle

TRENNUNGSZEICHEN ;;
CREATE DEFINER=`root`@`localhost` VERFAHREN `sss`(IN pid int, IN rootid int)
BEGINNEN
   
DECLARE fertig INT DEFAULT FALSE;
ID-TEXT DEKLARIEREN;
DECLARE cur1 CURSOR FÜR SELECT id FROM demo WHERE tid=pid;
DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDEN SET done = TRUE;

setze max_sp_recursion_depth = 200;
 
ÖFFNEN cur1;
  read_loop: SCHLEIFE
    Hole cur1 in ID;
    WENN erledigt, DANN
      LEAVE read_loop;
    ENDE, WENN;
    INSERT INTO temp(rootid,zid) Werte(rootid,id);
    rufe sss(id,rootid) auf;
  ENDE DER SCHLEIFE;
SCHLIESSEN cur1;

ENDE;;
TRENNUNGSZEICHEN ;

Haha, 3 Millionen Daten stecken auch in einem Ball~~~

Lass uns einen anderen Weg finden~~~~ Ich werde mich damit nicht mehr beschäftigen

Das könnte Sie auch interessieren:
  • So generieren Sie Datensätze stapelweise mithilfe gespeicherter Prozeduren in MySQL unter Linux
  • Einfache Implementierung von Mybatis, das eine gespeicherte MySQL-Prozedur aufruft
  • Vergleich der Unterschiede zwischen MySQL und Oracle: Fünf: Gespeicherte Prozeduren und Funktionen
  • Die gespeicherte MySQL-Prozedur ermittelt doppelte Daten und fügt sie nicht ein
  • Detaillierte Erklärung zum Aufrufen gespeicherter MySQL-Prozeduren in Java
  • Implementierung der Baumdurchquerung durch gespeicherte Prozeduren in der MySQL-Datenbank
  • Beispiel für die Optimierung gespeicherter MySQL-Prozeduren
  • Beispielanalyse gespeicherter Prozeduren in MySQL und wie gespeicherte Prozeduren aufgerufen werden
  • Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL

<<:  Zusammenfassung der Verwendung von berechneten Vue-Eigenschaften und -Listenern

>>:  So stellen Sie ElasticSearch in Docker bereit

Artikel empfehlen

Eine kurze Diskussion darüber, wie man Div und Tabelle auswählt und kombiniert

Das Seitenlayout war mir schon immer ein Anliegen...

Galeriefunktion durch natives Js implementiert

Inhaltsverzeichnis Der erste Der Zweite Native Js...

Ein Beispiel für die Implementierung eines adaptiven Quadrats mit CSS

Die traditionelle Methode besteht darin, ein Quad...

Detaillierte Erläuterung des Problemfalls beim Löschen des Vue KeepAlive-Cache

Keepalive wird häufig zum Caching in Vue-Projekte...

Dieser Artikel hilft Ihnen, den Lebenszyklus in Vue zu verstehen

Inhaltsverzeichnis 1. vorErstellen & erstellt...

Detaillierte Erläuterung der CSS-Randüberlappung und Lösungssuche

Ich habe kürzlich einige CSS-bezogene Wissenspunk...

Interpretation des CocosCreator-Quellcodes: Engine-Start und Hauptschleife

Inhaltsverzeichnis Vorwort Vorbereitung Gehen! Te...

Detaillierte Erklärung der Tomcat-Verzeichnisstruktur

Inhaltsverzeichnis Verzeichnisstruktur bin-Verzei...

Einfache Implementierung von Mini-Vue-Rendering

Inhaltsverzeichnis Vorwort Ziel Erster Schritt: S...

Verwendung und Beispiele für Linux-Befehle zur Echotextverarbeitung

Die Beschreibung von echo im Linux-Hilfedokument ...

So verwenden Sie einen Gamecontroller in CocosCreator

Inhaltsverzeichnis 1. Szenenlayout 2. Fügen Sie e...