mysql - 根据产品和付款表列出用户及其财务余额

标签 mysql sql select join

我有一个用户表:

用户表

╔════╦══════╗
║ 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/

相关文章:

mysql - 如何创建一个事件来查找日期是否大于一个月并返回值

sql - 合并: modifying multiple tables

sql - 如何获取字典中没有的单词?

mysql - 如何修复带有 timestampdiff 错误 1064 的 case 语句

mysql - 哪个 MySQL Select 查询是正确的

php - 如何检查使用旧版API的MySQL查询是否成功?

php - 将android连接到免费虚拟主机中的服务器

mysql - 如何使用 Tire 从 Elasticsearch 索引中获取数据而不访问数据库

sql - SQL计算总体成功率: Recursive CTE or Alternative Approach?

php - Codeigniter join 语句与 join 语句