MySQL如何统计满足特定条件的两张表中a.amount的总和?
解法:统计满足双关联条件的金额总和
这是个很常见的关联表多条件匹配统计场景,咱们一步步来实现需求:
需求拆解
我们需要筛选出同时满足以下两个条件的a表记录,再对它们的amount求和:
a.status = 1- 该记录在
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
相关产品推荐
相关产品推荐

