Mysql
 sql >> база данни >  >> RDS >> Mysql

Вземете сума от дървото на възлите

LTREE

Вие сте почти на прав път. Почти се натъкнахте на системата „LTREE“ за съхраняване на йерархични данни в база данни. Просто трябва да направите лека модификация. това е всичко.

Вашата таблица може да изглежда така:

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

И вашите данни може да изглеждат така.

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

Колоната път помага да се идентифицира коя компания е дъщерна на друга компания. Забележете, че всъщност не е нужно да имате allmoney колона. Това се генерира динамично.

И как намирате всички пари, които принадлежат на първата компания?

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

Забележете, че в структурата, която създадохме, child1 е родител за child2. И така, как да намерим всички пари за child1?

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

Има само една заявка и няма рекурсия.

MPTT

Друг популярен подход за извличане на йерархични данни е използването на модифицирано обхождане на дървото преди поръчка. Има отлична статия за Sitepoint в продължение на много години, което обяснява как се прави това с множество примерни кодове.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво не е наред с моя MySQL израз?

  2. Проблеми с RewriteMap MapType dbd

  3. mysql превръща множество редове в колони в един ред

  4. Необходимо е да се потърси различна комбинация от две полета, заедно с преброяване на тази различна комбинация

  5. MySQL INSERT - Имената на полетата изискват ли разграничаване с обратна отметка/акцент?