2017-05-12 3 views
0

Ich bin auf der Suche nach einer Abfrage, wo ich nach Daten nach Gruppen fragen kann. Beispiel:rekursive sql Suche

table group 
-uID-|-parentID-|-someData- 
0 | 0  | foo 
1 | 0  | bar 
2 | 1  | foobar 
3 | 2  | test 
4 | 2  | demo 

Die übergeordnete ID verweist auf die uID aus der parentalen Gruppe.

Zum Beispiel: wenn ich Gruppe 3 will, werde ich nur "Test" zurück. Wenn ich Gruppe 1 anfordere, sind die Ergebnisse: bar, foobar, test und demo. Also muss ich alle Zeilen abrufen, wo die ParentID mit meiner UID übereinstimmt, nach der ich suche. Hier

ist ein Bild von der Architektur zum besseren Verständnis: Architecture of groups

Wenn ich für die Gruppe suche 1, wird es bekommen und alle Untergruppen 2, 3 und 4.

Danke.

+0

Ich benutze sqlite. –

+1

Können Sie genauer erklären, wie Sie Bar, Foobar, Test und Demo von der anfordernden Gruppe 1 bekommen? – BobbyA

+0

Hier ist eine Frage mit Beispiel rekursiven Abfragen in SQLite: http://stackoverflow.com/questions/7456957/basic-recursive-query-on-sqlite3 –

Antwort

2

In sqlite können wir eine recursive CTE verwenden, um dies zu entfernen.

WITH RECURSIVE reccte AS 
(
    SELECT 
     uid as initialID, 
     uID, 
     parentID, 
     someData, 
     1 as depth 
    FROM table 
    WHERE uID = 1 /*starting point for recursive stuff*/ 

    UNION ALL 

    /*Recursive statement*/ 
    SELECT 
     reccte.initialID, 
     t1.uID, 
     t1.parentID, 
     someData, 
     depth + 1 
    FROM 
     reccte 
     INNER JOIN table as t1 ON 
      recCTE.uID = t1.parentID /*joining up the parent*/ 
    WHERE depth < 15 /*keep from endless loops*/ 
) 

/*Select all the someData's that resulted from the recursive lookup*/ 
SELECT someData FROM recCTE; 
+0

Ohne die 'Tiefe', es bestünde keine Gefahr für endlose Schleifen. –

+0

Ich bin nicht vertraut mit SQLite. Hat es einen Mechanismus in rekursiven Abfragen, um endlose Zyklen zu verhindern, wenn die tatsächlichen Daten von OP nicht sauber sind? – JNevill

+0

UNION entfernt alle doppelten Zeilen. (Wenn das nicht benötigt wird, wäre UNION ALL effizienter.) –