我的问题陈述是:我需要找到可以从原点“A”访问的地方及其各自的费用。
这是我的火车表(出发地、目的地、最低成本)
+--------+-------------+------+
| Origin | Destination | cost |
+--------+-------------+------+
| A | B | 1 |
| A | C | 4 |
| B | C | 2 |
| A | D | 4 |
+--------+-------------+------+
我尝试过查询:
with recursive Final(Origin, Destination, LeastCost) As(
-> (Select * from Train)
-> UNION
-> (Select T.Origin, F.Destination, F.LeastCost
-> from Train T, Final F
-> where T.Destination = F.Origin))
-> select * from Final ;
这给了我:
+--------+-------------+-----------+
| Origin | Destination | LeastCost |
+--------+-------------+-----------+
| A | B | 1 |
| A | C | 4 |
| B | C | 2 |
| A | D | 4 |
| A | C | 2 |
+--------+-------------+-----------+
我正在寻找的结果是
Origin | Destination | Price |
A C 3
由于 A-->B = 1, B-->C=2 ,所以最后一行 A-->C=1+2=3 。
我该如何实现这一目标?我尝试在递归查询中使用 SUM(LeastCost),但 MySQl 不允许在那里进行聚合。
最佳答案
在递归查询中将 T 和 F 别名的两个成本相加。 然后在最终查询中添加额外的逻辑来对结果进行分组:
with recursive Final(Origin, Destination, LeastCost) As(
(Select * from Train)
UNION
(Select T.Origin, F.Destination, T.cost + F.LeastCost
from Train T, Final F
where T.Destination = F.Origin)
)
select Origin, Destination, min(LeastCost)
from Final
group by Origin, Destination
通过递归机制T.cost + F.LeastCost
,当您从一个节点穿过树到另一个节点时,成本就会累加起来。
关于mysql - 如何在MySQL递归查询中求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53242413/