2012-09-14 40 views
0

我有以下查詢:MySQL的 - LEFT JOIN,其中沒有發現

SELECT  budgets_income.income_amount, budgets_income.rule_type, budgets_income_rules.day_of_week, budgets_income_rules.interval_week, budgets_income_rules.fixed_day, budgets_income_rules.last_day_month, budgets_income_rules.date_start, budgets_income_rules.date_end 
FROM  budgets_income 
LEFT JOIN budgets_income_rules USING (income_id) 
WHERE  budgets_income.account_id = :account_id 
    AND 
    (
     budgets_income_rules.date_start <= :date_end 
    ) 

如果budgets_income.rule_type等於1或2,然後在表budgets_income_rules有一個在那裏,我得到了LEFT JOIN的規則 - 這可以。

現在,有時如果規則等於0,則意味着該規則不存在。由於該規則不存在,因此budgets_income_rules.date_start字段也不存在 - 意味着該行不會與其他行一起提取(因爲WHERE budgets_income_rules.date_start <= :date_end)。

我想這些東西:

所有的
  • 首先,我這樣做:

    AND 
    (
        budgets_income_rules.date_start <= :date_end 
         OR 
        budgets_income_rules.date_start NOT EXISTS 
    ) 
    

    沒有工作這麼好,因爲它不會在所有的工作。

  • 在那之後,我做了anoter嘗試這樣的:

    AND 
    (
        budgets_income_rules.date_start <= :date_end 
         OR 
        budgets_income_rules.date_start IS NULL 
    ) 
    

因爲如果MySQL不會在LEFT JOIN找到行,然後將列設置爲NULL所做的邏輯工作。

現在我的問題,有沒有更好的方法來做到這一點?

謝謝。

+0

你的方式沒問題。 'IS NULL'是查找左連接行是否不存在的標準方法。 –

+0

@MichaelBerkowski感謝您的確認。但是,我想要一種方法來知道,就像gandaliter在下面的答案中所說的那樣。 –

回答

1

此時您還將獲得行,其中date_start在記錄中爲NULL。您可以使用budgets_income_rules表的id來測試NULL,因爲在連接查詢中該行不存在的地方只會爲NULL。

budgets_income_rules.id IS NULL 
+0

我喜歡你的方式,它的工作!非常感謝。以下是我在SELECT語句中添加的內容:IF(budgets_income_rules.income_id IS NULL,0,1)AS has_rule' –

+0

很好。你的if調用可能更普遍地表達爲'budgets_income_rules.income_id IS NOT NULL',並且不太清楚爲什麼你需要選擇它,你不能直接把它放在哪裏(甚至沒有在字段列表中甚至沒有列出income_id )? – gandaliter

+0

因爲如果沒有規則,這意味着收入必須作爲一個單一的入場券(一個獨特的收入)來對待,並且規則可能是每兩個星期的薪水支票或類似的東西。可能會發生規則沒有起始名稱的情況。爲什麼我不放在哪裏?減少對MySQL的工作,並使用IF在PHP中執行 - 它比WHERE更快。 –