如何获取子文件夹中项目的聚合值作为列

How to obtain the aggregate value of items in subfolders as a column

我正在使用 MySQL。

文件夹TABLE

id parent_folder_id
1 null
2 1
3 1
4 2
5 4
6 4
7 2
8 2

AUDIO_FILE_TABLE

id parent_folder_id duration
1 1 10
2 1 20
3 4 20
4 3 30
5 4 10
6 4 20
7 2 20
8 2 20

我想要一个输出来获取持续时间的总和(包括所有子文件夹),但不知道如何去做。 文件夹 1 在第一级有子文件夹 [2, 3],然后在第二级有 [4, 7, 8],然后在第三级有 [5, 6]。所以所有文件夹都是 [1, 2, 3, 4, 5, 6, 7, 8],其中包括所有音频,总和为 10 + 20 + 20 + 30 + 10 + 20 + 20 + 20 = 150.

文件夹 2 在第一级有子文件夹 [2],然后在第二级有子文件夹 [4, 7, 8],然后在第三级有 [5, 6]。所以所有文件夹都是 [2, 4, 5, 6, 7, 8],其中包括音频 [3, 5, 6, 7, 8],总和为 20 + 10 + 20 + 20 + 20 = 90.

文件夹 3 没有子文件夹。所以所有文件夹都是 [3],其中包括音频 [4],总和为 30。

输出

id parent_folder_id total_duration
1 1 150
2 1 90
3 4 30

你可以使用递归cte:

with recursive cte(id, id1) as (
   select f.id, f.id from folders f
   union all
   select c.id, f.id from cte c join folders f on f.parent_folder_id = c.id1
)
select k.*, f.parent_folder_id from 
   (select c.id, sum(a.duration) from cte c join audio_files a on c.id1 = a.parent_folder_id group by c.id) k 
join audio_files f on f.id = k.id