Xem lại thứ tự ưu tiên giữa AND và OR.
Trong số học, phép nhân có ưu tiên cao hơn phép cộng.
Ví dụ:10 + 10 * 10 =110, nhưng (10 + 10) * 10 =200.
Nó tương tự với AND và OR. AND có mức độ ưu tiên cao hơn OR, vì vậy điều này không có dấu ngoặc đơn:
WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1'
OR BookingInfo.ClinicID = '2'
hoạt động như thế này:
WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1')
OR BookingInfo.ClinicID = '2'
Nhưng bạn muốn nó hoạt động như thế này:
WHERE BookingInfo.BookingDate = '05-18-2010' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')
Vì vậy, hãy đặt trong dấu ngoặc đơn để đảm bảo thứ tự ưu tiên hoạt động theo cách bạn muốn.
Tôi cũng vừa nhận thấy rằng bạn đang sử dụng ngày ở định dạng MM-DD-YYYY, định dạng này không được MySQL nhận dạng cho các ký tự ngày. Bạn phải sử dụng định dạng YYYY-MM-DD. Điều đó có thể gây ra một vấn đề khác.
SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18
Nhận xét lại của bạn:
Có, tôi chắc chắn VÀ có mức độ ưu tiên cao hơn HOẶC. Thứ nhất, thứ bậc ưu tiên của tất cả các toán tử trong MySQL được ghi lại ở đây: http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html
Hãy xem qua một ví dụ bằng cách sử dụng vấn đề đã nêu ban đầu của bạn:
BookingDate ClinicID
2010-05-18 2
2008-05-18 2
WHERE BookingInfo.BookingDate = '2010-05-18' AND
BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'
Sử dụng biểu thức này, chỉ hàng đầu tiên phải khớp. Nhưng bạn thấy rằng cả hai hàng đều khớp, mặc dù ngày của hàng thứ hai không đúng. Tại sao? Hãy thay thế mỗi so sánh bằng TRUE hoặc FALSE:
TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE
Nếu HOẶC có mức độ ưu tiên cao hơn, nó sẽ đánh giá như thế này:
TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)
Vì bất kỳ giá trị nào được kết hợp với OR TRUE đều cho ra kết quả là TRUE, biểu thức con bên trong các dấu ngoặc đơn này sẽ giảm thành:
TRUE AND (TRUE)
FALSE AND (TRUE)
Và hàng thứ hai sẽ không khớp, bởi vì FALSE VÀ TRUE tạo ra FALSE. Nhưng điều đó không thể xảy ra, vì bạn thấy hàng thứ hai khớp không chính xác.
Trên thực tế, AND có mức độ ưu tiên cao hơn OR, vì vậy nó thực sự đánh giá như thể bạn có dấu ngoặc đơn xung quanh biểu thức con AND:
(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE
Điều này giảm xuống:
(FALSE) OR TRUE
(FALSE) OR TRUE
Trong cả hai trường hợp, FALSE OR TRUE cho ra TRUE và cả hai hàng đều khớp.
Vì vậy, không có dấu ngoặc đơn, ngữ nghĩa mặc định là AND có mức độ ưu tiên cao hơn OR. Bạn cần dấu ngoặc đơn:
WHERE BookingInfo.BookingDate = '2010-05-18' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')