sql >> Databasteknik >  >> RDS >> Mysql

Få summan från nodträdet

LTREE

Du är nästan på rätt spår. Du snubblade nästan över "LTREE"-systemet för att lagra hierakiell data i en databas. Du behöver bara göra en liten modifiering. det är allt.

Din tabell kan se ut så här:

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

Och din data kan se ut så här.

(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)

Sökvägskolumnen hjälper till att identifiera vilket företag som är ett dotterbolag till ett annat företag. Observera att du faktiskt inte behöver ha en allmoney kolumn. Detta genereras dynamiskt.

Och hur hittar man alla pengar som tillhör det första företaget?

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

Lägg märke till att i strukturen som vi har skapat är barn1 förälder för barn2. Så hur hittar vi alla pengar för barn1?

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

Det finns bara en fråga och ingen rekursion.

MPTT

En annan populär metod för att hämta hierarkisk data är att använda Modified Pre Order Tree Traversal. Det har varit en utmärkt artikel om Sitepoint under många år vilket förklarar hur detta görs med massor av exempelkod.



  1. Skapa en beräknad kolumn som använder data från en annan tabell i SQL Server

  2. Snabba upp massinsatsoperationer med NHibernate

  3. Praktiskt av flera databaser per klient kontra en databas

  4. Bestäm om en transaktion är aktiv (Postgres)