MySQL从多个表中减去相同ID的总和

标签 mysql database

好吧,首先这可能是一个非常复杂的问题,我会尽量解释清楚,以便你们能最好地帮助我。

这是关于我为生产计划部门开发的软件的数据库。首先我要说明我在这个命令中使用的表,有 4 个表你需要知道:ceramic_transaction(这意味着有陶瓷和交易表)和报告表


Ceramic_transaction 由 3 列组成:Ceramic_id、transaction_id、金额

report 包含:report_id, ceramic_id, transaction_id, amount

ceramic_transaction 表中的金额是客户需要的金额,而report 表中的金额是工作人员完成的金额。

然后我会给你测试的样本数据

Ceramic_transaction

 1. CT0046 T201600022 6 
 2. CT0047 T201600022 6

报告

 1. R0001 CT0046 T201600022 3
 2. R0001 CT0046 T201600022 2

问题是,我试图减去 worker 已完成的总量并显示需要完成的其余部分(我已经完成),但报告表中可用的其他陶瓷不会显示(甚至没有工作的那个),在本例中是 CT0047

代码示例:

SELECT CT.CERAMIC_ID , IF(CT.CERAMIC_ID = R.CERAMIC_ID, CT.AMOUNT - SUM(R.AMOUNT), CT.AMOUNT) as needs
FROM CERAMIC_TRANSACTION CT, REPORT R
WHERE CT.CERAMIC_ID = R.CERAMIC_ID AND CT.TRANSACTION_ID = R.TRANSACTION_ID GROUP BY CT.CERAMIC_ID

结果:

CT0046  1

期望的结果:

CT0046  1

CT0047  6

显然因为 CT0047 没有完成其中任何一个

编辑 1

如果 Ceramic_transaction 中还有其他数据表明 transaction_ID 不相同,则不应显示,这就是为什么我的代码位于 CT.transaction_ID = r.transaction_ID,我试图在每个 transaction_id

上显示工作人员尚未完成的 Ceramic

最佳答案

您的问题是您需要使用左连接:

SELECT CT.CERAMIC_ID ,
       IF(CT.CERAMIC_ID = R.CERAMIC_ID, CT.AMOUNT - SUM(R.AMOUNT), CT.AMOUNT) as needs
FROM CERAMIC_TRANSACTION CT
LEFT OUTER JOIN REPORT R
ON (CT.CERAMIC_ID = R.CERAMIC_ID
   AND CT.TRANSACTION_ID = R.TRANSACTION_ID)
WHERE CT.transaction_id = 'T201600022' 
GROUP BY CT.CERAMIC_ID

此问题来自于使用显式连接语法,您应始终避免这样做(表 1、表 2、...)。使用正确的连接语法 that you can read about here.

关于MySQL从多个表中减去相同ID的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35451349/

相关文章:

mysql - 显示计数以及 mysql 中的重复行

mysql - 具有多个外键的键

mysql innodb 每个表一个文件,每个文件位于不同的目录中?

database - 数据模型驱动的资源 ID 是资源还是数据库的一个方面?

mysql - 哪些 MySQL 命令可以使用列顺序而不是名称

mysql - sql根据2个值连接2个表

mysql - 如何将向量插入到 mysql 表的列中?

php - 实时/快速 mysql 查询生成器/查看器

安卓开发: Getting data from WordPress

php - WAMP Mysqli 不工作而 Mysql 工作