Sprawdź kolejność pierwszeństwa między AND i OR.
W arytmetyce mnożenie ma wyższy priorytet niż dodawanie.
Przykład:10+10*10 =110, ale (10+10)*10 =200.
Podobnie jest z AND i OR. AND ma wyższy priorytet niż OR, więc bez nawiasów:
WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1'
OR BookingInfo.ClinicID = '2'
działa tak:
WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1')
OR BookingInfo.ClinicID = '2'
Ale chcesz, żeby to działało tak:
WHERE BookingInfo.BookingDate = '05-18-2010' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')
Dlatego umieść w nawiasach, aby upewnić się, że kolejność pierwszeństwa działa tak, jak chcesz.
Zauważyłem również, że używasz dat w formacie MM-DD-RRRR, który nie jest rozpoznawany przez MySQL dla literałów daty. Musisz użyć formatu RRRR-MM-DD. To może powodować inny problem.
SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18
Odpowiedz na swój komentarz:
Tak, jestem pewien, że AND ma wyższy priorytet niż OR. Po pierwsze, hierarchia pierwszeństwa wszystkich operatorów w MySQL jest udokumentowana tutaj:http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html
Przyjrzyjmy się przykładowi, używając pierwotnie podanego problemu:
BookingDate ClinicID
2010-05-18 2
2008-05-18 2
WHERE BookingInfo.BookingDate = '2010-05-18' AND
BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'
Używając tego wyrażenia, tylko pierwszy wiersz powinien być zgodny. Ale okazało się, że oba wiersze są zgodne, mimo że data drugiego wiersza jest nieprawidłowa. Czemu? Zamieńmy każde porównanie na PRAWDA lub FAŁSZ:
TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE
Jeśli OR ma wyższy priorytet, będzie oceniane tak:
TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)
Ponieważ każda wartość połączona z OR TRUE daje TRUE, podwyrażenie wewnątrz tych nawiasów zmniejszy się do:
TRUE AND (TRUE)
FALSE AND (TRUE)
Drugi wiersz nie pasowałby, ponieważ FAŁSZ I PRAWDA dają FAŁSZ. Ale tak nie może być, ponieważ drugi wiersz jest niepoprawnie dopasowany.
W rzeczywistości AND ma wyższy priorytet niż OR, więc naprawdę ocenia się tak, jakbyś miał nawiasy wokół podwyrażenia AND:
(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE
Co sprowadza się do:
(FALSE) OR TRUE
(FALSE) OR TRUE
W obu przypadkach FALSE LUB TRUE daje PRAWDA, a oba wiersze są zgodne.
Tak więc bez nawiasów domyślna semantyka jest taka, że AND ma wyższy priorytet niż OR. Potrzebujesz nawiasów:
WHERE BookingInfo.BookingDate = '2010-05-18' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')