如何获取子文件夹中项目的聚合值作为列
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
我正在使用 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