mysql - 如何在MySQL递归查询中求和

标签 mysql

我的问题陈述是:我需要找到可以从原点“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/

相关文章:

mysql - 如何通过查看数据库中的角色列以经理或员工身份登录?

mysql - 排序 varchar 列

Mysql:如果行不安全地存在且具有键和唯一属性,则插入

MySQL从字符串中选择字段

mysql - 在 Windows 上为 ruby​​ 2.0.0 安装 mysql2 gem 时出错

mysql 触发器 - 限制存储在列中的值的数量

mysql - 从具有多行数据的表更新表

php - SQL、SELECT 特定日期未预订的项目

mysql - EXISTS 部分的结果

mysql - Json mysql 连接和数组转换错误。