2011-08-01 24 views
2

我試圖捲起被子公司支出包括所有的孫子公司沒有任何遞歸函數。改性預購樹橫向兒童易拉寶

我的數據集類似於這樣的格式:

Parent A 
- Child A.1 - $1,000 
- Child A.2 - $2,000 
- - Grandchild A.2.1 - $500 
- - Grandchild A.2.2 - $750 
- Child A.3 - $3,000 
- Child A.4 - $4,000 
Parent B 
- Child B.1 - $11,000 
- Child B.2 - $12,000 
- - Grandchild B.2.1 - $1,500 
- - Grandchild B.2.2 - $1,750 
- Child B.3 - $13,000 
- Child B.4 - $14,000 

我想要做的是孩子家長的總和,所以結果將輸出,如:

Child A.1 - $1,000 
Child A.2 - $3,250 
Child A.3 - $3,000 
Child A.4 - $4,000 

這是我公司表的簡化結構:

id 
name 
parent_id 
lft 
rght 

這是我的支出表的簡化結構:

id 
company_id 
amount 
date 

我知道如何列出每個孩子和他們的只是父金額:

SELECT 
`Company`.`name` AS `name`, 
SUM(`Spend`.`amount`) AS `amount` 
FROM 
`spend_table` AS `Spend` 
INNER JOIN companies_table AS `Company` ON `Spend`.`company_id` = `Company`.`id` 
INNER JOIN companies_table AS `thisCompany` ON `Company`.`lft` BETWEEN `thisCompany`.`lft` AND `thisCompany`.`rght` 
WHERE 
`thisCompany`.`name` = 'Parent A' 
GROUP BY 
`Company`.`name` 

這將輸出:

Child A.1 - $1,000 
Child A.2 - $2,000 
Grandchild A.2.1 - $500 
Grandchild A.2.2 - $750 
Child A.3 - $3,000 
Child A.4 - $4,000 

而且我知道如何總結爲每個孩子(不包括孫子女)父母A:

SELECT 
`Company`.`name` AS `name`, 
SUM(`Spend`.`amount`) AS `amount` 
FROM 
`spend_visibility2` AS `SpendVisibility` 
`spend_table` AS `Spend` 
INNER JOIN companies_table AS `Company` ON `Spend`.`company_id` = `Company`.`id` 
INNER JOIN companies_table AS `thisCompany` ON `Company`.`lft` BETWEEN `thisCompany`.`lft` AND `thisCompany`.`rght` 
WHERE 
`thisCompany`.`name` = 'Parent A' 
`Company`.`parent_id` = `thisCompany`.`id` 
GROUP BY 
`Company`.`name` 

會輸出:

Child A.1 - $1,000 
Child A.2 - $2,000 
Child A.3 - $3,000 
Child A.4 - $4,000 

有人可以幫我嗎?我相信我需要一個子選擇,但我很難搞清楚。

回答

0

首先,選擇孩子的公司,你有興趣(表三)。我用一個子查詢來方便地選擇在「父」的直接孩子。然後加入到companies_table再次檢索所有後代(表別名C2)的。最後加入到你的spend_table讓你可以使用聚合GROUP BY的金額。

select c.name, sum(s.amount) 
from companies_table c 
    join companies_table c2 ON c2.lft between c.lft and c.rght 
    join spend_table s ON c2.id = s.company_id 
where parent_id = (select id from companies_table where name = 'Parent A') 
group by c.name 
+0

完美!謝謝你的幫助! – Andrew