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である行も取得されます。行が存在しない結合クエリではNULLになるだけなので、budgets_income_rulesテーブルのIDを使用してNULLをテストできます。

budgets_income_rules.id IS NULL
于 2012-09-14T12:46:20.370 に答える