Прегледайте реда на приоритет между И и ИЛИ.
В аритметиката умножението има по-голям приоритет от събирането.
Пример:10+10*10 =110, но (10+10)*10 =200.
Подобно е с И и ИЛИ. И има по-висок приоритет от ИЛИ, така че това без скоби:
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 за литерали за дата. Трябва да използвате формат ГГГГ-ММ-ДД. Това може да е причина за друг проблем.
SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18
За вашия коментар:
Да, сигурен съм, че И има по-висок приоритет от ИЛИ. От една страна, йерархията на приоритета на всички оператори в 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'
Използвайки този израз, само първият ред трябва да съвпада. Но открихте, че и двата реда съвпадат, въпреки че датата на втория ред не е правилна. Защо? Нека заменим всяко сравнение с TRUE или FALSE:
TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE
Ако ИЛИ имаше по-висок приоритет, щеше да се изчисли по следния начин:
TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)
Тъй като всяка стойност, комбинирана с OR TRUE, дава TRUE, подизразът в тези скоби ще се намали до:
TRUE AND (TRUE)
FALSE AND (TRUE)
И вторият ред няма да съвпадне, защото FALSE И TRUE дава FALSE. Но това не може да бъде, тъй като сте открили, че вторият ред съвпада неправилно.
Всъщност И има по-висок приоритет от ИЛИ, така че наистина се оценява така, сякаш имате скоби около подизраза И:
(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE
Което се свежда до:
(FALSE) OR TRUE
(FALSE) OR TRUE
И в двата случая FALSE ИЛИ TRUE дава TRUE и двата реда съвпадат.
Така че без скоби, семантиката по подразбиране е, че И има по-висок приоритет от ИЛИ. Трябват ви скобите:
WHERE BookingInfo.BookingDate = '2010-05-18' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')