2016-11-22 4 views
4

Wie kann ich tun, um die Anzahl der Schritte zu erhalten, um einen Unterbaum zu bekommen.Wie bekomme ich die Anzahl der Schritte, um einen Unterbaum zu erhalten

Zum Beispiel habe ich eine Tabelle wie folgt aus:

id title  parent_id 
1  A   0 
2  B   0 
3  C   1 
4  F   3 
5  O   3 
6  D   2 
7  J   6 
8  T   2 
9  P   8 


A // 1 step 
    C //2 step 
     F //3 step 
     O //3 step 

B //1 step 
    D //2 step 
    J //3 step 
    T //2 step 
    P //3 step 

zum Beispiel, wenn I eine Zahl wie 1 (id = 1) geben, sollte es zurück 1 und ID = 6 sollte es 2 als Schritt zurück.

mein DBMS ist MySQL.

+1

Leider 'Mysql' unterstützt' Rekursive CTE' nicht. Dies kann leicht durch 'Recursive CTE' erfolgen –

Antwort

0

Es kann eine rekursive gespeicherte Prozedur sein, wenn Ihr Baum nicht sehr tief ist. So etwas wie dies (mit Zusatz von ordnungsgemäßem Zustand Handler), oder irgendetwas von der gleichen Art, kann es auf verschiedene Weise geschrieben werden:

DELIMITER $ 
CREATE PROCEDURE depth(IN n INT, OUT depth INT) 
BEGIN 
    DECLARE parent INT DEFAULT 0; 
    SET max_sp_recursion_depth=255; 
    SELECT parent_id INTO parent FROM t WHERE id=n; 
    IF parent = 0 THEN SET depth = 1; 
    ELSE CALL depth(parent,depth); SET depth = depth + 1; 
    END IF; 
END $ 
DELIMITER ; 

CALL(6,@depth); 
SELECT @depth; 

Auch MariaDB 10.2 unterstützt rekursive CTE. Es ist jetzt eine frühe Betaversion, also ist es nicht gut für die Produktion, aber wenn du nur deine Optionen auswertest, kannst du es ausprobieren. Das sollte funktionieren:

WITH RECURSIVE tree(id,parent_id,depth) AS 
    ( 
    SELECT id, parent_id, 1 from t WHERE parent_id=0 
    UNION ALL 
    SELECT t.id, t.parent_id, depth+1 FROM t JOIN tree ON tree.id = t.parent_id 
) SELECT * FROM tree WHERE id = 6; 
Verwandte Themen