如何从数据库中查询可传递链接的子事务的总和?
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_id 和 t_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;
我接到了一项作业,其中有很多奇怪的事情要做。我需要创建一个 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_id 和 t_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;