2010-07-18 9 views
9

Ich habe die folgende Tabelle:rekursive Selbst Abfrage

myTable: 
+----+----------+ 
| id | parentID | 
+----+----------+ 
| 1 |  null | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
| 5 |  4 | 
----------------- 

Ich mag würde alle Zeilen erhalten zurückverfolgen, bis es mehr nicht parentID ist. So “.... WHERE id = 5" würde mir geben:

5, 4, 2, 1 
+4

Regelmäßige Bill Karwin erstellt einige nette Erklärung der hierarchischen Daten und wie Sie die verschiedenen Lösungen verwenden: http://www.slideshare.net/billkarwin/models-for-hierarchical-data – Wrikken

+0

MySQL hat keine rekursive CTEs, also denke ich Dies würde einen Cursor benötigen, wenn Sie mit einer beliebigen Tiefe arbeiten müssen. Ändert sich die Struktur http://dev.mysql.com/tech-resources/articles/hierarchical-data.html eine Option? Oder können wir eine maximale Tiefe annehmen? Siehe auch diese verwandte Frage http://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-any –

+0

Bill Karwins Dias sind wirklich cool. – iddqd

Antwort

9

Sie organisieren Ihre hierarchischen Daten die adjacency list model verwenden. Die Tatsache, dass solche rekursiven Operationen schwierig sind, ist tatsächlich ein Hauptnachteil dieses Modells.

Einige DBMS, wie SQL Server 2005, Postgres 8.4 und Oracle 11g, unterstützen rekursive Abfragen unter Verwendung von common table expressions mit dem Schlüsselwort WITH.

Wie für MySQL, können Sie bei der Prüfung in dem folgenden Artikel interessiert sein, die ein alternatives Modell beschreibt (die nested set model), die rekursiven Operationen einfacher (möglich) macht:

Darüber hinaus schlage ich auch vor, Bill Karwin's presentation in den obigen Bemerkungen hingewiesen. Das beschriebene Verschlusstabellenmodell ist eine sehr gültige Alternative zu dem verschachtelten Satz.

+0

ok, vielen dank für die links & kommentare, ich bekomme es jetzt. Da ich nicht davon ausgehe, dass die Bäume sehr tief sind und ich das nur selten brauche, habe ich beschlossen, einfach zwei Self-Joins durchzuführen, und wenn die ParentID immer noch NULL ist, führe ich die Abfrage erneut aus. – iddqd

+0

@iddqd: Ja, das ist machbar. Aber wie Sie sehen, ist das die Einschränkung dieses Modells. –

+0

absolut, thx. – iddqd