0

以下のクエリを実行すると、NULL が返されます。

SELECT SUM(t.coupon_quantity)
FROM transaction t, coupon c, supplier s 
WHERE MONTH(date_entered) = MONTH(CURDATE()) 
AND  YEAR(date_entered) = YEAR(CURDATE()) 
AND t.coupon_id = c.id
AND c.supplier_id = s.id
AND s.id IN (SELECT us.supplier_id FROM user_supplier us WHERE us.user_id = 4);

最後の行を取り出すとレコードが返されますが、追加すると何も得られないため、サブクエリの問題であると思われます。

サブクエリを単独で実行すると、2 つの ID (14 と 15) が得られます。サブクエリを「AND s.id IN (14,15);」に置き換えると、...できます。何かご意見は?

4

2 に答える 2

0

サブクエリが重複なしで 14 と 15 のみを返す場合、次のクエリが機能するはずです (where in 句を別の結合で変更します)。

SELECT SUM(t.coupon_quantity)
FROM transaction t
JOIN coupon c on t.coupon_id = c.id
JOIN supplier s on c.supplier_id = s.id
JOIN user_supplier us on s.id = us.supplier_id and us.user_id = 4
WHERE MONTH(date_entered) = MONTH(CURDATE()) 
AND  YEAR(date_entered) = YEAR(CURDATE())

残念ながら、サブクエリが単独で機能するときに IN 句が機能しない理由がわかりません。

于 2014-04-30T22:08:52.557 に答える
0

慣例により、私は通常、コンマ結合構文と INNER JOIN を避けることをお勧めします。

これを試して、結果を見てください。彼らは、あなたが望む結果を得られない理由について、何らかの洞察を提供してくれるでしょう。

SELECT SUM(t.coupon_quantity)
FROM transaction t
LEFT JOIN coupon c ON t.coupon_id = c.id
LEFT JOIN supplier s ON c.supplier_id = s.id  -- First glance makes me think it should be t.supplier_id?
WHERE MONTH(date_entered) = MONTH(CURDATE())
  AND YEAR(date_entered) = YEAR(CURDATE())
  AND s.id IN (SELECT us.supplier_id FROM user_supplier us WHERE us.user_id = 4);

これにより、すべてのトランザクション レコードと、一致しない他のすべての null 値が提供されるため、データをより正確に調べることができます。構文を修正したら、必要に応じて LEFT を INNER に置き換えます。

于 2014-04-30T22:10:06.073 に答える