Mysql 根据产品和付款表列出用户的财务余额
我有一个用户表: 用户表Mysql 根据产品和付款表列出用户的财务余额,mysql,sql,select,join,Mysql,Sql,Select,Join,我有一个用户表: 用户表 ╔════╦══════╗ ║ ID ║ NAME ║ ╠════╬══════╣ ║ 1 ║ A ║ ║ 2 ║ B ║ ║ 3 ║ C ║ ╚════╩══════╝ ╔════╦═════════╦════════╗ ║ ID ║ USER_ID ║ AMOUNT ║ ╠════╬═════════╬════════╣ ║ 1 ║ 1 ║ 2000 ║ ║ 2 ║ 1 ║ 1000 ║ ║ 3 ║
╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ C ║
╚════╩══════╝
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 2000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 1000 ║
╚════╩═════════╩════════╝
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 1000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 500 ║
║ 5 ║ 2 ║ 500 ║
║ 6 ║ 3 ║ 1000 ║
╚════╩═════════╩════════╝
付款表
╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ C ║
╚════╩══════╝
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 2000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 1000 ║
╚════╩═════════╩════════╝
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 1000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 500 ║
║ 5 ║ 2 ║ 500 ║
║ 6 ║ 3 ║ 1000 ║
╚════╩═════════╩════════╝
产品表
╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ C ║
╚════╩══════╝
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 2000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 1000 ║
╚════╩═════════╩════════╝
╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║ 1 ║ 1 ║ 1000 ║
║ 2 ║ 1 ║ 1000 ║
║ 3 ║ 1 ║ 1000 ║
║ 4 ║ 2 ║ 500 ║
║ 5 ║ 2 ║ 500 ║
║ 6 ║ 3 ║ 1000 ║
╚════╩═════════╩════════╝
现在我想得到这样一个结果:
╔════╦══════╦═════════════════╗
║ ID ║ NAME ║ BALANCE ║
╠════╬══════╬═════════════════╣
║ 1 ║ A ║ +1000 (or 1000) ║
║ 2 ║ B ║ 0 ║
║ 3 ║ C ║ -1000 ║
╚════╩══════╩═════════════════╝
您不能直接联接表,因为表
用户
上的记录在另一个表上有多个匹配项,而有些记录没有,这会导致无效结果。我能想到的最好的方法是计算不同表中每个用户的总和,并将结果加入表user
SELECT a.*,
COALESCE(b.totalPayed,0) - COALESCE(c.total,0) balance
FROM user a
LEFT JOIN
(
SELECT user_ID, SUM(amount) totalPayed
FROM payment
GROUP BY user_ID
) b ON a.ID = b.user_ID
LEFT JOIN
(
SELECT user_ID, SUM(amount) total
FROM product
GROUP BY user_ID
) c ON a.ID = c.user_ID
╔════╦══════╦═════════╗
║ ID ║ NAME ║ BALANCE ║
╠════╬══════╬═════════╣
║ 1 ║ A ║ 1000 ║
║ 2 ║ B ║ 0 ║
║ 3 ║ C ║ -1000 ║
╚════╩══════╩═════════╝
要进一步了解加入的更多信息,请访问以下链接:
:-/
你如何决定黑白加减法的金额?@DreamEater对不起,我不懂黑白加减法。谢谢你,但我非常沮丧。我所能做的最多就是复制、粘贴您的查询,看看它自己的计算有多奇怪!好的,我应该谢谢你。没别的了,你还需要知道什么<代码>:)也许明天早上我应该仔细阅读!希望能有帮助。