Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据产品和付款表列出用户的财务余额_Mysql_Sql_Select_Join - Fatal编程技术网

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对不起,我不懂黑白加减法。谢谢你,但我非常沮丧。我所能做的最多就是复制、粘贴您的查询,看看它自己的计算有多奇怪!好的,我应该谢谢你。没别的了,你还需要知道什么<代码>:)也许明天早上我应该仔细阅读!希望能有帮助。