我有一个用户表:
用户表
╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ C ║
╚════╩══════╝
PAYMENT 表
╔════╦═════════╦════════╗
║ 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 ║
╚════╩══════╩═════════════════╝
最佳答案
您不能直接连接表,因为表 users
上的记录在另一个表上有多个匹配项,而有些则没有,这会导致无效结果。我能想到的最好的方法是计算每个用户在不同表上的总和,并将结果加入表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 ║
╚════╩══════╩═════════╝
要进一步了解有关联接的更多信息,请访问以下链接:
关于mysql - 根据产品和付款表列出用户及其财务余额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451622/