2016-11-27 17 views
1

で期待どおりに動作しない、LEFT JOIN私は3つのテーブルインナー参加し、mysqlの

table_supplier_bills - bill_id, supplier_id, date 
table_supplier_bill_details - bill_id, product_id, quantity, rate 
table_supplier_bill_payment_details - id, bill_id, payment_date, amount 

を持っています。

これは私の質問です。法案のためtable_supplier_bill_detailsの複数の行が存在する場合

select 
SB.bill_id, 
SB.date, SB.supplier_id, 
SUM(SBD.quantity * SBD.rate) as bill_amount, 
COALESCE(SUM(SBPD.payment_amount), 0.00) as paid_amount 
from table_supplier_bills SB 
INNER JOIN 
table_supplier_bill_details SBD 
ON SB.bill_id = SBD.bill_id 
LEFT JOIN table_supplier_bill_payment_details SBPD 
ON SBD.bill_id = SBPD.bill_id 
group by SBD.bill_id; 

しかし、このクエリは正しいpaid_amountを与えるものではありません。複数の行のクエリの場合は、そのテーブルのtable_supplier_bill_detailsにある行数だけ払い出されたpaid_amountを返します。

ここで間違っている人は誰でも助けてくれますか?

答えて

2

ではなく、相関クエリを使用します。

SELECT SB.bill_id, 
     SB.date, 
     SB.supplier_id, 
     SUM(SBD.quantity * SBD.rate) as bill_amount, 
     COALESCE((SELECT SUM(SBPD.payment_amount) 
       FROM table_supplier_bill_payment_details SBPD 
       WHERE SBD.bill_id = SBPD.bill_id),0.00) as paid_amount 
FROM table_supplier_bills SB 
INNER JOIN table_supplier_bill_details SBD 
ON SB.bill_id = SBD.bill_id 
GROUP BY SBD.bill_id; 
+0

これは期待通りに働いています。問題のクエリが機能しない理由をいくつかコメントに追加できますか?ありがとう。 –

+0

あなたはすでにそれが動作していない理由を知っているようです。1 * n関係の結合を持つクエリで集計関数を使用する場合、レコードが乗算されているため、間違ったデータが出力されます。相関クエリを使用する/結合前にデータを合算する方が良い。 – sagi