Tinjau urutan prioritas antara AND dan OR.
Dalam aritmatika, perkalian lebih diutamakan daripada penjumlahan.
Contoh:10+10*10 =110, tetapi (10+10)*10 =200.
Ini mirip dengan AND dan OR. AND memiliki prioritas lebih tinggi daripada OR, jadi ini tanpa tanda kurung:
WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1'
OR BookingInfo.ClinicID = '2'
bekerja seperti ini:
WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1')
OR BookingInfo.ClinicID = '2'
Tapi Anda ingin bekerja seperti ini:
WHERE BookingInfo.BookingDate = '05-18-2010' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')
Jadi, masukkan tanda kurung untuk memastikan urutan prioritas berfungsi seperti yang Anda inginkan.
Saya juga baru menyadari bahwa Anda menggunakan tanggal dalam format MM-DD-YYYY, yang tidak dikenali oleh MySQL untuk literal tanggal. Anda harus menggunakan format YYYY-MM-DD. Itu bisa menyebabkan masalah yang berbeda.
SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18
Kembali komentar Anda:
Ya, saya yakin AND lebih diutamakan daripada OR. Untuk satu hal, hierarki prioritas semua operator di MySQL didokumentasikan di sini:http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html
Mari kita lihat contoh menggunakan masalah yang Anda nyatakan sebelumnya:
BookingDate ClinicID
2010-05-18 2
2008-05-18 2
WHERE BookingInfo.BookingDate = '2010-05-18' AND
BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'
Menggunakan ekspresi ini, hanya baris pertama yang cocok. Tetapi Anda menemukan bahwa kedua baris cocok, meskipun tanggal baris kedua tidak tepat. Mengapa? Mari kita ganti setiap perbandingan dengan TRUE atau FALSE:
TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE
Jika OR memiliki prioritas yang lebih tinggi, evaluasinya akan seperti ini:
TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)
Karena nilai apa pun yang digabungkan dengan OR TRUE menghasilkan TRUE, subekspresi di dalam tanda kurung ini akan berkurang menjadi:
TRUE AND (TRUE)
FALSE AND (TRUE)
Dan baris kedua tidak cocok, karena FALSE AND TRUE menghasilkan FALSE. Tapi itu tidak mungkin, karena Anda menemukan baris kedua salah cocok.
Faktanya, AND memiliki prioritas lebih tinggi daripada OR, jadi ini benar-benar mengevaluasi seolah-olah Anda memiliki tanda kurung di sekitar subekspresi AND:
(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE
Yang dikurangi menjadi:
(FALSE) OR TRUE
(FALSE) OR TRUE
Dalam kedua kasus, FALSE OR TRUE menghasilkan TRUE, dan kedua baris cocok.
Jadi tanpa tanda kurung, semantik defaultnya adalah AND memiliki prioritas lebih tinggi daripada OR. Anda memerlukan tanda kurung:
WHERE BookingInfo.BookingDate = '2010-05-18' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')