2010-07-18 16 views
9

Tengo la siguiente tabla:auto consulta recursiva

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

me gustaría obtener todas las filas que se remontan hasta que no parentID más. Así " .... donde id = 5" me daría:

5, 4, 2, 1 
+4

Regular Bill Karwin creó una buena explicación de datos jerárquicos y cómo usar las diferentes soluciones: http://www.slideshare.net/billkarwin/models-for-hierarchical-data – Wrikken

+0

MySQL no tiene CTE recursivos, así que creo esto necesitaría un cursor si necesita manejar una profundidad arbitraria. ¿Está cambiando la estructura http://dev.mysql.com/tech-resources/articles/hierarchical-data.html una opción? ¿O podemos suponer algo de profundidad máxima? También vea esta pregunta relacionada http://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-any –

+0

Las diapositivas de Bill Karwin son geniales. – iddqd

Respuesta

9

Usted está organizando sus datos jerárquicos utilizando la adjacency list model. El hecho de que tales operaciones recursivas sean difíciles es de hecho una desventaja principal de este modelo.

Algunos DBMS, como SQL Server 2005, Postgres 8.4 y Oracle 11g, admiten consultas recursivas usando common table expressions con la palabra clave WITH.

En cuanto a MySQL, usted puede estar interesado en probar el siguiente artículo que describe un modelo alternativo (el nested set model), lo que hace que las operaciones recursivas más fácil (posibles):

Además, también sugiero verificar Bill Karwin's presentation señalado en los comentarios anteriores. El modelo de tabla de cierre descrito es una alternativa muy válida al conjunto anidado.

+0

ok, muchas gracias por los enlaces y comentarios, lo entiendo ahora. Dado que no estoy asumiendo que los árboles sean muy profundos y solo necesito esto rara vez, he decidido simplemente hacer dos uniones, y si el parentID aún NO ES NULO, ejecuto la consulta nuevamente. – iddqd

+0

@iddqd: Sí, eso es factible. Pero como ven, esa es la limitación de este modelo. –

+0

absolutamente, thx. – iddqd