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

MySQL如何对两个不同表的列做减法计算全量用户净资产变化

问题原因

你当前使用的是内连接JOIN,只会返回同时存在于sent和received两个视图中的用户,因此只有同时有转出和转入记录的用户会出现在结果中,只有转出的用户5、只有转入的用户4就被过滤掉了。

解决方案

方案1:基于现有视图调整查询

MySQL不支持全外连接,我们可以先通过UNION拿到所有涉及的用户ID,再左关联两个视图计算净资产变化:

SELECT 
  u.user_id AS 'user',
  COALESCE(r.total_received, 0) - COALESCE(s.total_sent, 0) AS net_change
FROM (
  -- 拿到所有出现过的用户ID
  SELECT sender AS user_id FROM sent
  UNION
  SELECT receiver AS user_id FROM received
) u
LEFT JOIN sent s ON u.user_id = s.sender
LEFT JOIN received r ON u.user_id = r.receiver
ORDER BY net_change DESC;

执行后返回的完整结果如下:

+------+------------+
| user | net_change |
+------+------------+
|    1 |         20 |
|    3 |          5 |
|    4 |          5 |
|    5 |        -10 |
|    2 |        -20 |
+------+------------+

方案2:直接从原始交易表计算(更简洁高效)

不需要预先创建统计视图,可以直接对原始交易表做行列转换计算:

SELECT 
  user_id AS 'user',
  SUM(amount) AS net_change
FROM (
  -- 转入记录金额记为正
  SELECT receiver AS user_id, amount FROM transactions1
  UNION ALL
  -- 转出记录金额记为负
  SELECT sender AS user_id, -amount FROM transactions1
) t
GROUP BY user_id
ORDER BY net_change DESC;

这个方案逻辑更直观,也避免了多表关联的性能消耗,返回结果和方案1完全一致。

内容的提问来源于stack exchange,提问作者Angel Torres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:15:06