LTRREE
Vous êtes presque sur la bonne voie. Vous êtes presque tombé sur le système 'LTREE' de stockage des données hiérarchiques dans une base de données. Vous avez juste besoin de faire une légère modification. c'est tout.
Votre tableau pourrait ressembler à ceci :
CREATE TABLE Table1
(`id` int, `parent_id` int, `name` varchar(13),
`path` char(10),
`money` int)
;
Et vos données pourraient ressembler à ceci.
(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 colonne de chemin permet d'identifier quelle société est une filiale d'une autre société. Notez que vous n'avez pas réellement besoin d'avoir un allmoney
colonne. Ceci est généré dynamiquement.
Et comment trouve-t-on tout l'argent qui appartient à la première entreprise ?
select sum(money) from Table1 where path >= '1' and path < '2'
Notez que dans la structure que nous avons créée, enfant1 est le parent de enfant2. Alors, comment trouver tout l'argent pour enfant1 ?
select sum(money) from Table1 where path >= '1.1' and path < '1.2'
Il n'y a qu'une seule requête et aucune récursivité.
MPTT
Une autre approche populaire pour récupérer des données hiérarchiques consiste à utiliser la traversée d'arborescence de pré-commande modifiée. Il y a eu un excellent article sur Sitepoint depuis de nombreuses années, ce qui explique comment cela se fait avec de nombreux exemples de code.