You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何统计满足特定条件的两张表中a.amount的总和?

解法:统计满足双关联条件的金额总和

这是个很常见的关联表多条件匹配统计场景,咱们一步步来实现需求:

需求拆解

我们需要筛选出同时满足以下两个条件的a表记录,再对它们的amount求和:

  1. a.status = 1
  2. 该记录在s表中同时存在b_id=20和b_id=21的关联行
    预期结果为9000(对应a.id=4031的3000 + a.id=4034的6000)

解法1:分组+HAVING(通用所有SQL数据库)

这是最通用的写法,几乎所有主流数据库都支持:

SELECT SUM(a.amount) AS total_amount
FROM a
JOIN s ON a.id = s.a_id
WHERE a.status = 1
  AND s.b_id IN (20, 21) -- 先过滤出目标b_id的关联记录,减少计算量
GROUP BY a.id
HAVING COUNT(DISTINCT s.b_id) = 2 -- 确保当前a记录同时关联了20和21两个b_id

逻辑说明:

  • 通过JOIN关联两张表,先过滤掉a.status≠1和s.b_id不是20/21的无效数据
  • 按a.id分组,每个分组对应一条a表的记录
  • HAVING COUNT(DISTINCT s.b_id)=2:用DISTINCT避免同一个b_id重复出现导致的误判,确保分组内同时包含20和21两个值

解法2:子查询+交集(适用于支持INTERSECT的数据库)

如果你的数据库支持INTERSECT语法(比如PostgreSQL、SQL Server、Oracle),可以用更直观的交集写法:

SELECT SUM(a.amount) AS total_amount
FROM a
WHERE a.status = 1
  AND a.id IN (
    -- 先找出所有关联b_id=20的a_id
    SELECT s.a_id FROM s WHERE s.b_id = 20
    -- 再和关联b_id=21的a_id取交集,得到同时满足的a_id
    INTERSECT
    SELECT s.a_id FROM s WHERE s.b_id = 21
  )

逻辑说明:

  • 子查询部分通过INTERSECT获取同时关联了20和21的a_id集合
  • 外层查询筛选a.status=1且id在该集合内的记录,最后求和amount

两种解法最终都会得到预期的9000结果。

内容的提问来源于stack exchange,提问作者hamed khorasani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:24:37