2016-06-02 2 views
2

Der Versuch, einige hierarchische Daten zu sammeln, um sie an Dritte zu senden, und wurde an this post gerichtet.Gespeicherte Prozedur Zeitüberschreitung

Nach dem Versuch, es zu meinem Anwendungsfall auf zwicken, hält die gespeicherte Prozedur Zeitlimit.
Also habe ich es zweimal lokal versucht (via PhpMyAdmin).
Wenn ich versuche, PMA im Browser nach dem Aufruf der gespeicherten Prozedur neu zu laden, bekomme ich nur ein ewiges "Warten auf Antwort" Spinner (mehr als 10 oder 20 Minuten).

Ich nehme an, dass etwas mit meinem SP-Code nicht stimmt ???

CREATE TABLE foo 
    (`id` int, `name` varchar(100), `parentId` int, `path` varchar(100)) 
// 

INSERT INTO foo (`id`, `name`, `parentId`, `path`) 
VALUES (1, 'discrete', 0, NULL), 
     (2, 'res', 1, NULL), 
     (3, 'smt', 2, NULL), 
     (4, 'cap', 1, NULL), 
     (5, 'ind', 1, NULL), 
     (6, 'smt', 4, NULL), 
     (7, 'tant', 6, NULL), 
     (8, 'cer', 6, NULL) 
// 

CREATE PROCEDURE updatePath() 
BEGIN 
DECLARE cnt, n int; 
    SELECT COUNT(*) INTO n FROM foo WHERE parentId = 0; 
    UPDATE foo a, foo b SET a.path = b.name WHERE b.parentId IS NULL AND a.parentId = b.id; 
    SELECT count(*) INTO cnt FROM foo WHERE path IS NULL; 
    while cnt > n do 
     UPDATE foo a, foo b SET a.path = concat(b.path, '|', b.id) WHERE b.path IS NOT NULL AND a.parentId = b.id; 
     SELECT count(*) INTO cnt FROM foo WHERE path IS NULL; 
    end while; 
END// 

EDIT
Erwartete Ergebnisse:

VALUES (1, 'discrete', 0, '1'), 
     (2, 'res', 1, '1|2'), 
     (3, 'smt', 2, '1|2|3'), 
     (4, 'cap', 1, '1|4'), 
     (5, 'ind', 1, '1|5'), 
     (6, 'smt', 4, '1|4|6'), 
     (7, 'tant', 6, '1|4|6|7'), 
     (8, 'cer', 6, '1|4|6|8'); 
+0

In Bezug auf das Aufrufen von SPs in SqlFiddle, ist mein Verständnis, dass sie aus dem Schemabereich aufgerufen werden sollten. Wenn ich das falsch verstanden habe, rate bitte. – mOrloff

+0

Und BTW, ich bin offen für völlig andere Ansätze (wie temporäre Tabellen oder ???), wenn es Vorteile gibt, dies zu tun. – mOrloff

Antwort

1

Nach einen guten Schlaf kommen, Ich nahm @ Drews Führung und ich ging einen pc nach dem anderen durch.
Habe es funktioniert. Hier ist, wo ich es verlasse:

CREATE TABLE foo 
    (`id` int, `name` varchar(100), `parentId` int, `path` varchar(100)) 
// 

INSERT INTO foo 
    (`id`, `name`, `parentId`, `path`) 
VALUES 
    (1, 'dscr', 0, NULL), 
    (2, 'res', 1, NULL), 
    (3, 'smt', 2, NULL), 
    (4, 'cap', 1, NULL), 
    (5, 'ind', 1, NULL), 
    (6, 'chp', 4, NULL), 
    (7, 'tant', 6, NULL), 
    (8, 'cer', 6, NULL) 
// 

CREATE PROCEDURE updatePath() 
BEGIN 
DECLARE cnt, n int; 

    SELECT COUNT(*) INTO n FROM foo WHERE parentId = 0; -- n is now 1 
    SELECT COUNT(*) INTO cnt FROM foo WHERE path IS NULL; -- cnt is now 8 

    UPDATE foo child, foo parent  -- each child now has its parent and own ID's in the path 
     SET child.path = CONCAT(parent.id, '|', child.id) 
     WHERE parent.parentId = 0 
     AND child.parentId = parent.id; 

    WHILE cnt > n DO 
     UPDATE foo child, foo parent -- concat parent's path and own ID into each empty child's path 
      SET child.path = concat(parent.path,'|',child.id) 
      WHERE parent.path IS NOT NULL 
      AND child.parentId = parent.id; 

     SELECT COUNT(*) INTO cnt -- decrement cnt 
      FROM foo 
      WHERE path IS NULL; 

    END WHILE; 

    UPDATE foo -- set path for any top-level categories 
     SET path = id 
     WHERE path IS NULL; 

END// 

call updatePath()// 

Fühlen Sie sich frei zu kritisieren.
Hoffe das hilft jemand anderen irgendwann.

0

Versuchen Sie, ein sich selbst verweis beitreten zu tun, um die Hierarchie zu schaffen?

a.name wählen, Parent = b.name aus foo ein, äußere foo b auf ( a.id = b.parentId )

+0

Ja, aber mehr als Ihr Vorschlag. Wir versuchen, eine Pfadzeichenfolge über eine selbstverweisende Verknüpfung zu erstellen und zu speichern. Ich frage mich auch, ob Ihr Vorschlag für einen anderen Geschmack von SQL ist, weil einige davon nicht ganz richtig aussehen (durch meine begrenzten MySQL-Objektive) – mOrloff

+0

Ja, tut mir leid, das war für SQL Server, aber der Prinzipal sollte wahr sein . – hivie7510

+0

Ja, richtiges Prinzip. Die Notwendigkeit das ** rekursiv zu tun ist, wo es etwas über meine Tiefen-XP hinausgeht – mOrloff