MySQL组按最低公共父ID

use*_*527 3 mysql

我有一个包含一个单一的表ID,AmountParent_ID.(实际上它有点复杂,但这是本例中的所有重要列).基本上我想要做的是将Amount列与最低公共父项(即父ID为NULL的那些)进行分组和求和.

ID  Amount  Parent_ID
1   100     NULL
2   150     1
3   50      1
4   75      3
5   25      4
6   125     NULL
7   50      6
8   50      7
9   100     8
Run Code Online (Sandbox Code Playgroud)

预期成绩:

ID  SUM
1   400
6   325
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它只会返回两个记录,即没有父级的记录,这意味着它们是顶级项目.Sum列是Amount递归所有子项的总和,因此ID= 1是1,2,3,4和5 ID的总和.= 6是6,7,8和9的总和.

mel*_*okb 6

如果您可以在层次结构中定义级别数限制,则可以将此解决方案扩展到任意数量的级别:

select
    coalesce(t5.ID,t4.ID,t3.ID,t2.ID,t1.ID) as Root,
    sum(t1.Amount) as Amount
from Table1 t1
left join Table1 t2 on t1.Parent_ID = t2.ID
left join Table1 t3 on t2.Parent_ID = t3.ID
left join Table1 t4 on t3.Parent_ID = t4.ID
left join Table1 t5 on t4.Parent_ID = t5.ID
group by Root
Run Code Online (Sandbox Code Playgroud)

只需left join根据需要添加更多内容并将其添加到的列中coalesce.

演示:http://www.sqlfiddle.com/#!2/b7a79/17