Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Obter soma da árvore de nós

LTREE


Você está quase no caminho certo. Você quase tropeçou no sistema 'LTREE' de armazenamento de dados hierárquicos em um banco de dados. Você só precisa fazer uma pequena modificação. isso é tudo.

Sua tabela pode ficar assim:
CREATE TABLE Table1
    (`id` int, `parent_id` int, `name` varchar(13),
     `path` char(10),
     `money` int)
;

E seus dados podem ficar assim.
(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)

A coluna de caminho ajuda a identificar qual empresa é subsidiária de outra empresa. Observe que você não precisa ter um allmoney coluna. Isso é gerado dinamicamente.

E como você encontra todo o dinheiro que pertence à primeira empresa?
select sum(money) from Table1 where path >= '1' and path < '2'

Observe que na estrutura que criamos, child1 é o pai de child2. Então, como encontramos o allmoney para child1?
select sum(money) from Table1 where path >= '1.1' and path < '1.2'

Há apenas uma consulta e nenhuma recursão.

MPTT


Outra abordagem popular para buscar dados hierárquicos é usar o Modified Pre Order Tree Traversal. Houve um excelente artigo sobre Sitepoint por muitos anos, o que explica como isso é feito com muitos códigos de amostra.