LÁRBOL
Estás casi en el camino correcto. Casi se tropieza con el sistema 'LTREE' de almacenamiento de datos jerárquicos en una base de datos. Solo necesitas hacer una ligera modificación. eso es todo.
Su tabla podría verse así:
CREATE TABLE Table1
(`id` int, `parent_id` int, `name` varchar(13),
`path` char(10),
`money` int)
;
Y sus datos podrían tener este aspecto.
(1, 0, 'company 1', '1', 10),
(2, 1, 'child 1', '1.1', 10),
(3, 2, 'child 2', '1.1.1', 10),
(4, 1, 'child 3', '1.2', 10,),
(4, 1, 'company 2', '2', 10),
(4, 1, 'child 2.1', '2.1', 10)
La columna de ruta ayuda a identificar qué empresa es una subsidiaria de otra empresa. Tenga en cuenta que en realidad no necesita tener un allmoney
columna. Esto se genera dinámicamente.
¿Y cómo encuentras todo el dinero que pertenece a la primera empresa?
select sum(money) from Table1 where path >= '1' and path < '2'
Observe que en la estructura que hemos creado, child1 es el padre de child2. Entonces, ¿cómo encontramos todo el dinero para child1?
select sum(money) from Table1 where path >= '1.1' and path < '1.2'
Solo hay una consulta y no hay recursividad.
MPTT
Otro enfoque popular para obtener datos jerárquicos es utilizar el recorrido de árbol de orden previo modificado. Ha habido un excelente artículo sobre Sitepoint durante muchos años, lo que explica cómo se hace esto con mucho código de muestra.