1

私の目標は、まだすべての製品を受け取っていない発注書のみを表示することです。

と呼ばれるマスターテーブルとtest_po他の2つのテーブルtest_po_bomがありtest_rog_bomます。およびテーブルは、製品のリストを格納する場所です test_po_bom。は私が注文した製品のリストであり、は私が受け取った製品のリストです。test_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ごとに合計を集計します。
  • 合体を使用して、テーブルの少なくとも1つ(おそらくtest_rog_bom)にIDの行がない状況に対処します。そもそもこれが問題の原因だったのではないかと思います。
于 2012-08-21T20:49:22.780 に答える
1

問題はクエリにあるようです。使用せず*、代わりに目的の列を指定してください。次のソリューションでは、エイリアスを使用して、特に類似した名前でコードを読みやすくします。また、WHEREの代わりにHAVINGに気付くでしょう。

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 に答える