0

これがばかげた質問で申し訳ありませんが、最近 SQL をあまり使用しておらず、これについてもあまり役に立ちません。

結果が 0 または null の場合でも、結果に表示されるすべての行を取得する必要があります。私が抱えている問題は、WHERE句が原因です(WHERE行がないと、行はすべて表示されますが、データは表示されません)。

SELECT SUM(c.amount) AS 'total_income', p.ref_id AS 'property'
FROM property p
LEFT JOIN contract c
ON p.id = c.property_ref_id
LEFT JOIN contract_payment cp
ON c.id = cp.contract_id   
WHERE cp.paid = 1 AND year(cp.date_paid) = :year
GROUP BY p.id

Where と Bad Data なしで結果セットを表示すると、次のようになります。

array
  0 => 
    array
      'total_income' => null
      'property' => string 'test/0001' (length=9)
  1 => 
    array
      'total_income' => null
      'property' => string 'test/0002' (length=9)
  2 => 
    array
      'total_income' => string '200' (length=3)
      'property' => string 'test/0003' (length=9)
  3 => 
    array
      'total_income' => string '16100' (length=5)
      'property' => string 'test/0004' (length=9)

これは WHERE 句と適切なデータを含む結果セットですが、すべての行ではありません

array
  0 => 
    array
      'total_income' => string '4200' (length=4)
      'property' => string 'test/0004' (length=9)

目的のデータを取得するために、SQL にどのような変更を加えることができるか教えてください。

4

1 に答える 1

0

問題は、一致がない場合は 1 にならないcpため、テーブルに一致しないすべての行を除外していることです。cp.paid

WHERE 句を次のように変更します。

WHERE cp.contract_id IS NULL OR (cp.paid = 1 AND year(cp.date_paid) = :year)

または、cp を使用してその条件を LEFT JOIN の ON 句に移動します。

ON c.id = cp.contract_id AND cp.paid = 1 AND year(cp.date_paid) = :year
于 2013-04-04T09:40:23.373 に答える