MySQL使用多个表

时间:2016-02-17 08:24:00

标签: mysql database

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

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

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

report由以下内容组成: report_id,ceramic_id,transaction_id,金额

事情是ceramic_transaction表的数量是客户需要的数量,而report表上的数量是工人所做的数量。

然后我将为您提供测试的样本数据

Ceramic_transaction

 1. CT0046 T201600022 6 
 2. CT0047 T201600022 6

report

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

问题是,我试图减去工人完成的总量并显示需要完成的其余工作(我已经完成了),但报告表中可用的其他陶瓷赢了& #39; t出现(即使没有工作的那个),在这种情况下它是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

RESULT

CT0046  1

DESIRED RESULTS

CT0046  1

CT0047  6

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

编辑1

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

工人尚未完成的陶瓷

1 个答案:

答案 0 :(得分:1)

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

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

这个问题来自使用显式连接语法,你应该总是避免这样做(Table1,table2,...)。使用正确的连接that you can read about here.

语法