with recursive query multiple data all mysql sql data-structures tree hierarchical-data

recursive - tree in mysql database



Cruce de árbol SQL (3)

No estoy totalmente seguro de estar nombrando este derecho, pero por favor tengan paciencia conmigo.

Me pregunto si es posible hacer algo como esto en SQL (MySQL específicamente): Digamos que tenemos datos similares a un árbol que se conservan en la base de datos en la siguiente tabla:

mysql> desc data_table; +------------------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | parent_id | int(10) unsigned | YES | MUL | NULL | | | value | text | YES | | NULL | |

Por lo tanto, cada fila tiene un elemento principal, a excepción de la fila ''raíz'' y cada fila tiene elementos secundarios, excepto las filas de hojas.

¿Es posible encontrar todos los descendientes de cualquier fila utilizando únicamente SQL?


Es posible obtener todos los descendientes utilizando únicamente SQL, pero no en una sola consulta. Pero estoy seguro de que lo descubriste; Supongo que quieres decir que quieres hacerlo en una sola consulta.

Puede que le interese leer sobre algunos diseños alternativos para almacenar estructuras de árbol, que sí le permiten buscar todos los descendientes utilizando una sola consulta SQL. Vea mi presentación Modelos para datos jerárquicos con SQL y PHP .

También puede usar consultas SQL recursivas con otras marcas de bases de datos (por ejemplo, PostgreSQL), pero MySQL no admite esta característica.


Probablemente sea mejor con el modelo de conjunto anidado (ver http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - más abajo). Es mucho más eficiente para seleccionar y puede obtener la ruta completa a cada nodo con una simple unión automática. Sin embargo, en la práctica es una buena idea precaché de ruta y profundidad si desea hacer cosas como "donde profundidad = 3" o si desea mostrar la ruta completa de múltiples nodos si tiene más de 1000 registros en su tabla.