如何从数据库中查询可传递链接的子事务的总和?

How to query sum total of transitively linked child transactions from database?

我接到了一项作业,其中有很多奇怪的事情要做。我需要创建一个 API 来存储交易细节并进行一些操作。一个这样的操作涉及检索所有交易的总和,这些交易通过它们的 parent_id 传递链接到 $transaction_id.

如果A是B和C的父级,C是D和E的父级,那么

sum(A) = A + B + C + D + E

注意:不仅仅是直接子交易。

我在 SQL 数据库中有此示例数据,如下所示。

MariaDB [test_db]> SELECT * FROM transactions;
+------+-------+----------+---------+
| t_id | t_pid | t_amount | t_type  |
+------+-------+----------+---------+
|    1 |  NULL | 10000.00 | default |
|    2 |  NULL | 25000.00 | cars    |
|    3 |     1 | 30000.00 | bikes   |
|    4 |  NULL | 10000.00 | bikes   |
|    5 |     3 | 15000.00 | bikes   |
+------+-------+----------+---------+
5 rows in set (0.000 sec)

MariaDB [test_db]> 

其中 t_id 是唯一的 transaction_idt_pid 是一个 parent_id,它要么是 null,要么是现有的 t_id.

所以,当我说 sum(t_amount) 其中 t_id=1,我希望结果是

sum(1+3+5) -> sum(10000 + 30000 + 15000) = 55000.

我知道我可以通过一些递归以编程方式实现这一点,递归将重复查询操作并添加总和。但是,如果数据非常大,比如数百万条记录,那会给我带来很差的性能。

我想知道是否有可能通过复杂的查询实现这一点。如果是,那么该怎么做?

我对数据库的了解和经验很少。我尝试了我所知道的,但我做不到。我尝试在此处搜索任何类似的查询,但没有找到。 根据我的研究,我想我可以通过存储过程和使用 HAVING 子句来实现这一点。让我知道我是否在场并帮助我做到这一点。

因此,我们将不胜感激。

提前致谢。

您需要递归 CTE:

with recursive cte as (
      select t_id as ultimate_id, t_id,  t_amount
      from tranctions t
      where t_id = 1
      union all
      select cte.ultimate_id, t.t_id, t.amount
      from cte join
           transactions tc
           on tc.p_id = cte.t_id
     )
select ultimate_id, sum(t_amount)
from cte
group by ultimate_id;