MySQL组按最低公共父ID

时间:2012-04-20 17:55:26

标签: mysql

我有一个包含IDAmountParent_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

预期结果:

ID  SUM
1   400
6   325

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

2 个答案:

答案 0 :(得分: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

只需根据需要添加更多left join,然后将其添加到coalesce中的列列表中。

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

答案 1 :(得分:0)

要实现您正在寻找的东西,您需要一个递归存储过程,因为您不需要某些能够限制结构深度的东西。

我认为更改数据结构会更容易。添加一个列,将每个子项与其顶级父项相关联。这样你就可以通过一个简单的GROUP BY来获得你想要的东西。