[英]SQL join 3 tables with one having a SUM column
我相信这很简单,但是我正在努力弄清楚如何进行这项工作。 我有三个表:
1个临时表和2个其他表
下表是化妆:
newartbl(custid是唯一的)-监护权 ,已分配,newBalance
jobbooktbl(leadid是唯一的) -Leadid,价格
paymenttbl(无唯一列)-交易金额
客户ID = leadid =的CustID
这是我尝试过但不起作用的内容:
$sqlnewbal = "SELECT b.custid, j.price, b.assigned, SUM(p.amount) AS sumAmnt
FROM jobbooktbl j, newartbl b, paymentstbl p
WHERE j.leadid=b.custid AND b.custid=p.custid";
$qrynewbal = mysqli_query($db,$sqlnewbal);
while ($row = mysqli_fetch_array($qrynewbal)) {
$custid = $row['custid'];
$price = $row["price"];
$paid = $row['sumAmnt'];
$assigned = $row['assigned'];
$newPaid = $paid/$assigned;
$newPrice = $price/$assigned;
$newBal = $newPrice-$newPaid;
$usqlUpdate = $db->prepare("UPDATE newartbl SET newBalance=? WHERE custid=?");
$usqlUpdate->bind_param('di',$newBal,$custid);
$usqlUpdate->execute();
}
这输出为空。
预期的结果是将paystbl中的金额列与与我要取SUM的其他两个tbl中的交易清单相匹配的总和从jobbooktbl的price列中减去,然后将新值插入临时表中。
我确定我缺少一些简单的东西,但是似乎无法动弹。
UPDATE
只是意识到我没有解释该部门。 一些监护人是共享的,我想查找每个分配的价格和金额。
样本数据:
newartbl-
custid | assigned | newBalance
1 | 1 | Null
2 | 2 | Null
工作簿-
leadid | price
1 | 9400
2 | 3000
付款方式-
custid | amount
1 | 400
sql的预期结果应为
newartbl-
custid | assigned | newBalance
1 | 1 | 9000
2 | 2 | 1500
实际发生的是
custid | assigned | newBalance
1 | 1 | Null
2 | 2 | Null
这是我想出的解决方案。。。
$sqlnewbal = "SELECT b.custid, j.price, b.assigned
FROM jobbooktbl j, newartbl b
WHERE j.leadid=b.custid";
$qrynewbal = mysqli_query($db,$sqlnewbal);
while ($row = mysqli_fetch_array($qrynewbal)) {
$custid = $row['custid'];
$price = $row["price"];
$assigned = $row['assigned'];
$newBal = $price/$assigned;
$usqlUpdate = $db->prepare("UPDATE newartbl SET newBalance=? WHERE custid=?");
$usqlUpdate->bind_param('di',$newBal,$custid);
$usqlUpdate->execute();
}
$sqlnewbal = "SELECT b.custid, b.assigned, b.newBalance, SUM(p.amount) AS sumAmnt
FROM paymentstbl p, newartbl b
WHERE p.custid=b.custid";
$qrynewbal = mysqli_query($db,$sqlnewbal);
while ($row = mysqli_fetch_array($qrynewbal)) {
$custid = $row['custid'];
$paid = $row["sumAmnt"];
$price = $row["newBalance"];
$assigned = $row['assigned'];
$newPaid = $paid/$assigned;
$newBal = $price-$newPaid;
$usqlUpdate = $db->prepare("UPDATE newartbl SET newBalance=? WHERE custid=?");
$usqlUpdate->bind_param('di',$newBal,$custid);
$usqlUpdate->execute();
}
考虑一个没有PHP循环的纯SQL解决方案。 MySQL可以对UPDATE
语句运行UPDATE
,您可以在其中通过聚合子查询进行更新。 请注意,您的查询已调整为使用显式的JOIN
和完整的GROUP BY
,它们均符合ANSI-92(行业标准):
UPDATE newartbl n
INNER JOIN
(SELECT b.custid, j.price, b.assigned, SUM(p.amount) AS sumAmnt
FROM jobbooktbl j
INNER JOIN newartbl b
ON j.leadid = b.custid
INNER JOIN paymentstbl p
ON b.custid = p.custid
GROUP BY b.custid, j.price, b.assigned) sub
ON n.custid = sub.custid
SET n.newBalance = (sub.price / sub.assigned) - (sub.sumAmnt / sub.assigned);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.