18 de mai de 2016 01:36 do volos

Obter soma da árvore de nós

Eu estou aprendendo php. Eu tenho essa estrutura

company 1 - $10| all $50
-company 1.1 - $10| all $20
--company 1.1.1 - 10$| all $10
-company 1.2 - $20| all $20

cada empresa pode ter várias empresas filhas e apenas um pai. Cada empresa tem dinheiro. Todas as empresas têm Allmoney - dinheiro próprio + dinheiro de todas as empresas filhas.

No MySQL esta estrutura como esta

id|parent_id|name|money|allmoney
1| 0| company 1| 10|###
2| 1| company 1.1|10 |###
3| 2| company 1.1.1|10 |###
4| 1| company 1.2|10 |###

Então, como eu calculo allmoney para cada empresa em php? Eu agora, que preciso usar recursão, mas tento e nada não pode acontecer. SELECT, UPDATE e outro comando mysql - Eu sei, por favor me ajude com php. Eu estou escrevendo algo assim:

function updatemoney($id)
    {
        $data = CS50::query("SELECT ...", $id);
        $allmoney = 0;

        if(count($data) > 0)
        {
            foreach($data as $row)
            {

                $allmoney += $row["cash"];
               //somewhere this, maybe need ubdate my db 
                $allmoney += updatemoney($row["id"]);
            }
        }
        else return 0;
    }

Muito obrigado

questionAnswers (0)

18 de mai de 2016 14:47 do volos

Minha solução

function updatemoney($id)
{
    $child = mysql_query("SELECT * FROM `company` WHERE `parent_id` = ?", $id);
    if(empty($child))
    {
        mysql_query("UPDATE `company` SET `allcash`=`cash` WHERE `id`=?", $id);
    }
    else
    {
        for($i = 0; $i< count($child); $i++)
        {
            updatemoney($child[$i]["id"]);
        }
        $childmoney = mysql_query("SELECT sum(`allcash`) AS `total` FROM `company` WHERE `parent_id` = ?", $id);
        $parentmoney = mysql_query("SELECT `cash` FROM `company` WHERE `id` = ?", $id);
        $sum = $childmoney[0]["total"] + $parentmoney[0]["cash"];
        mysql_query("UPDATE `company` SET `allcash`=? WHERE `id`=?", $sum, $id);

    }
18 de mai de 2016 00:19 do e4c5
LTREE

'LTREE' de armazenamento de dados hierárquicos em um banco de dados. Você só precisa fazer uma ligeira 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ê realmente não precisa ter umallmoney 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 todo o dinheiro 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 a busca de dados hierárquicos é usar o Modified Pre Order Tree Traversal. Houve um excelente artigo sobrePonto do site por muitos anos, o que explica como isso é feito com muitos códigos de amostra.

yourAnswerToTheQuestion