繁体   English   中英

SQL连接3个表,其中一个表具有SUM列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM