Heim  >  Artikel  >  Datenbank  >  Wie berechnet man hierarchische Größen in MySQL mithilfe einer rekursiven gespeicherten Prozedur?

Wie berechnet man hierarchische Größen in MySQL mithilfe einer rekursiven gespeicherten Prozedur?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 08:16:31783Durchsuche

How to Calculate Hierarchical Quantities in MySQL Using a Recursive Stored Procedure?

Rekursive gespeicherte Prozedur in MySQL zur Berechnung hierarchischer Mengen

Die vorliegende Aufgabe besteht darin, eine gespeicherte Prozedur in MySQL zu erstellen, die die berechnete Menge rekursiv berechnet auf einer Eltern-Kind-Beziehung innerhalb einer Tabelle. Schauen wir uns die Lösung genauer an.

Die bereitgestellte Deklaration der gespeicherten Prozedur berechnet mithilfe der Rekursion effektiv die Gesamtmenge für einen bestimmten Knoten. So funktioniert es:

  1. Prozedurdeklaration:

    <code class="mysql">CREATE PROCEDURE calctotal(IN number INT, OUT total INT)
    BEGIN</code>

    Dies deklariert eine gespeicherte Prozedur namens calctotal, die eine Ganzzahl als Eingabe und verwendet gibt eine ganzzahlige Summe als berechnete Menge zurück.

  2. Variableninitialisierung:

    <code class="mysql">DECLARE parent_ID INT DEFAULT NULL;
    DECLARE tmptotal INT DEFAULT 0;
    DECLARE tmptotal2 INT DEFAULT 0;</code>

    Diese Variablen werden verwendet, um Zwischenwerte während der Rekursion zu speichern Prozess.

  3. Eltern-ID und Anfangsmenge abrufen:

    <code class="mysql">SELECT parentid FROM test WHERE id = number INTO parent_ID;
    SELECT quantity FROM test WHERE id = number INTO tmptotal;</code>

    Dadurch werden die Eltern-ID und die Anfangsmenge für die angegebene Nummer abgerufen.

  4. Rekursive Anrufbearbeitung:

    <code class="mysql">IF parent_ID IS NULL
     THEN
     SET total = tmptotal;    -- The node is a root node, set total to its quantity.
    ELSE
     CALL calctotal(parent_ID, tmptotal2);    
     SET total = tmptotal2 * tmptotal;    -- Total for current node is product of parent's total and current node's quantity.
    END IF;</code>

    a. Wenn die übergeordnete ID NULL ist, bedeutet dies, dass der Knoten ein Wurzelknoten ist, sodass die Summe seiner Menge entspricht.
    b. Andernfalls wird calctotal rekursiv mit der übergeordneten ID aufgerufen, um die Gesamtsumme für das übergeordnete Element zu berechnen. Dann multipliziert es die Summe dieses übergeordneten Knotens mit der Menge des aktuellen Knotens, um die Summe für den aktuellen Knoten zu erhalten.

  5. Beispiel für einen Prozeduraufruf:

    <code class="mysql">SET @@GLOBAL.max_sp_recursion_depth = 255;
    SET @@session.max_sp_recursion_depth = 255;
    
    CALL calctotal(6, @total);
    SELECT @total;</code>

    Um die gespeicherte Prozedur verwenden zu können, müssen Sie mithilfe dieser Konfigurationseinstellungen die maximale Rekursionstiefe festlegen. Anschließend können Sie calctotal mit der entsprechenden Nummer anrufen. Das Ergebnis wird in der Variable @total gespeichert, die anschließend abgerufen werden kann.

  6. Rekursiver Fluss:

    • Der Vorgang beginnt mit Berechnen der Summe für die gegebene Zahl.
    • Wenn der Knoten ein Wurzelknoten ist, entspricht seine Summe seiner Menge.
    • Andernfalls wird die Summe für den übergeordneten Knoten rekursiv berechnet.
    • Schließlich multipliziert es die Summe des übergeordneten Knotens mit seiner eigenen Menge, um die Summe für den Knoten zu erhalten.

Diese rekursive gespeicherte Prozedur bietet eine praktische Möglichkeit, hierarchische Mengen zu berechnen basierend auf den angegebenen Eltern-Kind-Beziehungen in der Datenbanktabelle.

Das obige ist der detaillierte Inhalt vonWie berechnet man hierarchische Größen in MySQL mithilfe einer rekursiven gespeicherten Prozedur?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn