Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按最低公共父ID划分的MySQL组_Mysql - Fatal编程技术网

按最低公共父ID划分的MySQL组

按最低公共父ID划分的MySQL组,mysql,Mysql,我有一个表,其中包含ID、Amount和Parent\u ID。(事实上,这有点复杂,但这是本例中所有重要的专栏)。基本上,我想做的是将Amount列按最低的公共父项(即父项id为NULL的父项)分组并求和 预期成果: ID SUM 1 400 6 325 如您所见,它只会重新运行两条记录,即没有父项的记录,这意味着它们是顶级项。Sum列是其所有子项金额的递归总和,因此ID=1是1,2,3,4和5的总和。而ID=6是6、7、8和9的和。要实现所需的功能,您需要一个递归存储过程,因为您

我有一个表,其中包含
ID
Amount
Parent\u ID
。(事实上,这有点复杂,但这是本例中所有重要的专栏)。基本上,我想做的是将Amount列按最低的公共父项(即父项id为NULL的父项)分组并求和

预期成果:

ID  SUM
1   400
6   325

如您所见,它只会重新运行两条记录,即没有父项的记录,这意味着它们是顶级项。Sum列是其所有子项
金额的递归总和,因此
ID
=1是1,2,3,4和5的总和。而
ID
=6是6、7、8和9的和。

要实现所需的功能,您需要一个递归存储过程,因为您不需要限制结构深度的内容


我认为更改数据结构会更容易。添加将每个子级与其顶级父级关联的列。这样,您就可以通过一个简单的
分组获得所需的内容。如果您可以定义层次结构中级别数的限制,则可以将此解决方案扩展到任意级别数:

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
中的列列表中


演示:

是否设置了嵌套的编号?Ie你会在5点停下来,还是会一直持续下去?理论上它会一直持续下去,但如果没有解决方案,我想我可以选择一个只持续到5点左右的解决方案。测试设置环境:关于针对MySQL的递归查询的许多问题。。。如果没有实际的存储过程来处理链上的每个递归级别,就无法完成。MySQL不支持分层查询。我将给出一些建议,这里也有一些例子。。正在查找它们。。。答案很好。我想给你+2。一个用于coalesce,这是我以前没有见过的,另外一个用于sqlfiddle的+1。多好的工具啊!!好的,这是一个很好的解决方法,但是我看到了一个奇怪的bug。在我的表中还有一个Name列,我想在查询时选择它。问题是,当我同时选择名称时,它是错误的(所选名称与具有根id的项的名称不同)。请参见此示例(注意,我必须重新安排插入以实现此目的):不管怎样,看起来我也需要合并名称:
合并(t5.Name,t4.Name,t3.Name,t2.Name,t1.Name)为名称
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