1

我的目标是只显示尚未收到所有产品的采购订单。

我有一个名为的主表test_po和另外两个表test_po_bom。和表是我存储产品列表的地方 test_rog_bom。是我订购的产品列表,是我收到的产品列表。test_po_bomtest_rog_bomtest_po_bomtest_rog_bom

基本上:loop purchase_orders WHERE products_received < products_ordered

表结构:

table `test_po`: `ID`, `vendor_ID`
table `test_po_bom`: `ID`, `po_ID`, `product_ID`, `quantity`
table `test_rog_bom`: `ID`, `po_ID`, `product_ID`, `quantity`

代码:

$SQL = "SELECT
        *,
        test_po.ID AS test_po_ID
      FROM
        test_po
      LEFT JOIN test_po_bom ON test_po_bom.po_ID=test_po.ID
      LEFT JOIN test_rog_bom ON test_rog_bom.po_ID=test_po.ID
      WHERE
        (SELECT SUM(quantity) FROM test_rog_bom WHERE po_ID=test_po.ID) < (SELECT SUM(quantity) FROM test_po_bom WHERE po_ID=test_po.ID)";

$result = mysql_query($SQL) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
  echo $row['test_po_ID'].'<br>';
}

它不会吐出任何东西,我尝试了许多不同的变化,但我就是想不通。

4

2 回答 2

1

这是未经测试的代码。对于发布未经测试的代码,我深表歉意,但我现在无法对其进行测试,而且我认为它展示了一些让您尝试不同的东西,即使它不完全正确。

尝试这个:

select po.ID, po_bom.quant n_ordered, rog_bom.quant n_received
from test_po po
left join (select po_ID, sum(quantity) as quant from test_po_bom group by po_ID) po_bom
  on po.ID = po_bom.po_ID
left join (select po_ID, sum(quantity) as quant from test_rog_bom group by po_ID) rog_bom
  on po.ID = rog_bom.po_ID
where coalesce(rog_bom.quant, 0) < coalesce(po_bom.quant, 0);

这会改变您的操作方式:

  • 使用表别名来明确指定哪些引用引用同一表行。
  • 使用 group by 按 ID 聚合总和。
  • 使用合并来处理至少一个表(可能是 test_rog_bom)没有 ID 行的情况。我怀疑这实际上是您问题的根源。
于 2012-08-21T20:49:22.780 回答
1

问题似乎与您的查询有关。不要使用*而是指定所需的列。以下解决方案使用别名来帮助您的代码更具可读性,尤其是名称相似的代码。您还会注意到HAVING而不是 WHERE。

SELECT 
    p.ID as PO_ID
     ,p.VENDOR_ID
     ,pb.product_ID as PRODUCT_ID
     ,SUM(pb.quantity) as QUANTITY_ORDERED
     ,SUM(rb.quantity) as QUANTITY_RECEIVED
FROM test_po as p
LEFT JOIN test_po_bom as pb ON pb.po_ID = p.ID
LEFT JOIN test_rog_bom as rb ON rb.po_ID = p.ID
GROUP BY
    p.ID
     ,p.VENDOR_ID
     ,pb.product_ID
HAVING SUM(rb.quantity) < SUM(pb.quantity)
于 2012-08-21T20:49:49.540 回答