ANDとORの間の優先順位を確認します。
算術演算では、乗算は加算よりも優先されます。
例:10 + 10 * 10 =110、ただし(10 + 10)* 10=200。
ANDやORと似ています。 ANDはORよりも優先順位が高いため、これは括弧なしで行われます:
WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1'
OR BookingInfo.ClinicID = '2'
このように機能します:
WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1')
OR BookingInfo.ClinicID = '2'
ただし、次のように機能させる必要があります:
WHERE BookingInfo.BookingDate = '05-18-2010' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')
したがって、括弧を入れて、優先順位が希望どおりに機能することを確認してください。
また、MM-DD-YYYY形式の日付を使用していることに気付きました。これは、MySQLでは日付リテラルとして認識されません。 YYYY-MM-DD形式を使用する必要があります。それは別の問題を引き起こしている可能性があります。
SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18
コメントを再確認してください:
はい、確かにANDの方がORよりも優先されます。 1つには、MySQLのすべての演算子の優先順位の階層がここに文書化されています: http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html
最初に述べた問題を使用して例を見てみましょう:
BookingDate ClinicID
2010-05-18 2
2008-05-18 2
WHERE BookingInfo.BookingDate = '2010-05-18' AND
BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'
この式を使用すると、最初の行のみが一致する必要があります。しかし、2番目の行の日付が正しくない場合でも、両方の行が一致していることがわかりました。なんで?各比較をTRUEまたはFALSEに置き換えましょう:
TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE
ORの優先順位が高い場合、次のように評価されます。
TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)
OR TRUEと組み合わせた値はTRUEになるため、これらの括弧内の部分式は次のようになります。
TRUE AND (TRUE)
FALSE AND (TRUE)
また、FALSE AND TRUEはFALSEになるため、2番目の行は一致しません。しかし、2行目が正しく一致していないことがわかったため、それはできません。
実際、ANDはORよりも優先順位が高いため、AND部分式を括弧で囲んでいるかのように評価されます。
(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE
これは次のようになります:
(FALSE) OR TRUE
(FALSE) OR TRUE
どちらの場合も、FALSEまたはTRUEはTRUEになり、両方の行が一致します。
したがって、括弧がない場合、デフォルトのセマンティクスでは、ANDがORよりも優先されます。かっこが必要です:
WHERE BookingInfo.BookingDate = '2010-05-18' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')