mysql - 使用中间表将一张表的值更新为相关表的求和值

标签 mysql many-to-many

我有三个表 A、A_B 和 B。
由于mySQL不支持多对多关系,表A和B通过中间表A_B相互关联。

Table A:    Table A_B:  Table B:
aId aCount  aId bId     bId bCo
1   10      1   1       1   4
2   15      1   2       2   5
3   20      2   1       3   6
            3   2       4   7
            3   4

现在我想将每个 bId 的 bCount 添加到每个相关的 aCount。
期望的结果:

Table A:    Remark:
aId aCount  (Current aCount + all related bCounts)
1   19      (10 + 4 + 5)
2   19      (15 + 4)
3   32      (20 + 5 + 7)

我的mySQL知识太基础了。
我可以创建一个 SELECT 查询,它给我一个结果表,就像我希望表 A 在更新后看起来一样,但我无法创建更新语句。我尝试的一切都会导致语法错误或不期望的结果。 我还有一项可能有效的声明,但执行起来需要很长时间。现在我只是很困惑该怎么办。
期望的结果如下:

SELECT `aId`, aCount + SUM(`bCount`) as `aCount` from `A`
INNER JOIN `A_B` ON `A_B`.`aId` =   `A`.`aId`
INNER JOIN `B`   ON   `B`.`bId` = `A_B`.`bId`
GROUP BY `aId`;

是否可以通过单个查询进行像我想要的更新,还是需要多个查询(性能方面)?
任何人都可以帮助我找到一种方法或创建语句吗?

最佳答案

尝试以下:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0b6a287d41eed001710e94612c4228ba

select x.id,x.val,sum(tableb.val)+x.val as vals from 
(select * from tablea inner join tableab on tablea.id=tableab.id1) x inner join
tableb on x.id2=tableb.id 
group by x.id,x.val,id1

输出:

id  val vals
1   10  19
2   15  19
3   20  32

更新表:

UPDATE tablea INNER JOIN
(SELECT x.id, x.val, SUM(tableb.val) + x.val as vals FROM
    (SELECT * FROM tablea INNER JOIN tableab ON tablea.id = tableab.id1) x INNER JOIN
    tableb ON x.id2 = tableb.id 
    GROUP BY x.id, x.val, id1)Z ON tablea.id=Z.id 
SET tablea.val = Z.vals;

关于mysql - 使用中间表将一张表的值更新为相关表的求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52533781/

相关文章:

php - 具有特定字符的数据无法保存到数据库

php - 无法在实体 A 到 B 之间添加新的 ManyToMany 属性,因为我已经拥有这两个实体的 ManyToMany 属性

mysql - 我正在使用此查询从一个表的两列中进行搜索,但这不起作用

c# - EF 中多对多连接的最佳实践

c# - Entity Framework 查询多对多关系

java - hibernate : failed to lazily initialize a collection

mongodb - 下面的多对多关系应该如何在 MongoDB 中建模?

MySQL #1243 给 EXECUTE 的未知准备语句处理程序 (stmt)

php - 检查 mysql 列中是否存在某个值

mysql - 连接到 AWS Elastic Beanstalk 上的 Mysql