Mysql
 sql >> Database >  >> RDS >> Mysql

Ottieni la somma dall'albero dei nodi

TRE

Sei quasi sulla strada giusta. Ti sei quasi imbattuto nel sistema "LTREE" di archiviazione dei dati gerarchici in un database. Hai solo bisogno di fare una leggera modifica. questo è tutto.

La tua tabella potrebbe assomigliare a questa:

CREATE TABLE Table1
    (`id` int, `parent_id` int, `name` varchar(13),
     `path` char(10),
     `money` int)
;

E i tuoi dati potrebbero essere così.

(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 colonna del percorso aiuta a identificare quale società è una filiale di un'altra società. Nota che in realtà non è necessario avere un allmoney colonna. Questo viene generato dinamicamente.

E come trovi tutti i soldi che appartengono alla prima azienda?

select sum(money) from Table1 where path >= '1' and path < '2'

Si noti che nella struttura che abbiamo creato, child1 è il genitore di child2. Allora come troviamo tutti i soldi per il bambino1?

select sum(money) from Table1 where path >= '1.1' and path < '1.2'

C'è solo una query e nessuna ricorsione.

MPTT

Un altro approccio popolare per il recupero dei dati gerarchici è l'utilizzo di Modified Pre Order Tree Traversal. È stato pubblicato un eccellente articolo su Sitepoint per molti anni che spiega come questo viene fatto con lotti di codice di esempio.