2012-04-19 84 views
1

我覺得有一種方法可以使用條件案例或Ifs來做到這一點,但我無法弄清楚。有條件Where子句如果左連接返回行嗎?

下面的查詢將三個表連接在一起,並且如果所有三個表都返回行,它將很好地工作。但是,有些情況下記錄存在於campaign_groups和new_advertisers中,但沒有記錄在payment_transactions中。

由於WHERE子句確保payment_transactions.transaction_date> = campaign_groups.date_created,排除了具有零事務的行。

只有當LEFT JOIN返回行時,有沒有方法可以應用WHERE子句?

SELECT sum(payment_transactions.transaction_amount) as payment, 
      new_advertisers.account_id, 
      new_advertisers.advertiser_id, 
      max(payment_transactions.transaction_date) as last_payment, 
      campaign_groups.id, 
      campaign_groups.date_created, 
      TIMESTAMPDIFF(DAY, max(payment_transactions.transaction_date), NOW()) as days_passed 
     FROM campaign_groups 
     INNER JOIN new_advertisers ON campaign_groups.advertiser_id = new_advertisers.advertiser_id 
     LEFT JOIN payment_transactions ON payment_transactions.account_id = new_advertisers.account_id 
     WHERE payment_transactions.transaction_date >= campaign_groups.date_created 
      AND campaign_groups.weekly_budget_cents > 0 
     ORDER BY days_passed DESC 

回答

2

移動狀態到您的從句:

LEFT JOIN payment_transactions 
    ON payment_transactions.account_id = new_advertisers.account_id 
    AND payment_transactions.transaction_date >= campaign_groups.date_created 
WHERE campaign_groups.weekly_budget_cents > 0 
+0

所以此工程,八九不離十。如果我刪除了SELECT中的聚合函數(例如SUM,MAX),它可以工作,大概是因爲如果這些字段不存在就不能聚合? 我試着添加一個IFNULL來檢查,但沒有幫助。例如。 IFNULL(SUM(payment_transactions.transaction_amount),0)作爲付款, – Zach 2012-04-19 22:32:00

+0

@Zach:您的查詢看起來不正確。你是否缺少GROUP BY?在使用聚合函數時,在SELECT列表中包含不在聚合函數或GROUP BY子句中的字段通常是錯誤的。事實上,大多數其他數據庫會立即給你一個錯誤,甚至不會嘗試運行該查詢。你可以配置MySQL更嚴格,這樣它也會給你的查詢提供一個錯誤,而不是返回無用的結果。在這裏看到更多的信息:http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html – 2012-04-19 22:59:49

+0

啊,這就是訣竅。我需要在new_advertisers.account_id上添加一個GROUP BY,並在days_passed上進行IFNULL()測試(因爲如果沒有事務返回,它將爲空)。謝謝您的幫助! – Zach 2012-04-19 23:06:10