0

我收到以下查询:

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
    )
    

    效果不太好,因为它根本不起作用。

  • 在那之后,我做了另一个这样的尝试:

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

这在逻辑上确实有效,因为如果 MySQL 在 中找不到该行LEFT JOIN,则该列设置为NULL

现在我的问题是,有没有更好的方法呢?

谢谢。

4

1 回答 1

1

目前,您还将获得date_start记录中为 NULL 的行。您可以使用 budgets_income_rules 表的 id 来测试 NULL,因为在不存在该行的连接查询中这只会是 NULL。

budgets_income_rules.id IS NULL
于 2012-09-14T12:46:20.370 回答