Bekijk de volgorde van prioriteit tussen AND en OR.
Bij rekenen heeft vermenigvuldigen een hogere prioriteit dan optellen.
Voorbeeld:10+10*10 =110, maar (10+10)*10 =200.
Het is vergelijkbaar met AND en OR. AND heeft een hogere prioriteit dan OR, dus dit zonder haakjes:
WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1'
OR BookingInfo.ClinicID = '2'
werkt als volgt:
WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1')
OR BookingInfo.ClinicID = '2'
Maar je wilt dat het zo werkt:
WHERE BookingInfo.BookingDate = '05-18-2010' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')
Zet dus tussen haakjes om ervoor te zorgen dat de volgorde van prioriteit werkt zoals u dat wilt.
Ik heb net ook gemerkt dat je datums gebruikt in de indeling MM-DD-YYYY, die niet wordt herkend door MySQL voor letterlijke datums. U moet de indeling JJJJ-MM-DD gebruiken. Dat kan een ander probleem veroorzaken.
SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18
Over uw opmerking:
Ja, ik weet zeker dat AND een hogere prioriteit heeft dan OR. Om te beginnen wordt de rangorde van alle operators in MySQL hier gedocumenteerd:http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html
Laten we een voorbeeld doornemen met uw oorspronkelijk aangegeven probleem:
BookingDate ClinicID
2010-05-18 2
2008-05-18 2
WHERE BookingInfo.BookingDate = '2010-05-18' AND
BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'
Met deze uitdrukking moet alleen de eerste rij overeenkomen. Maar je hebt geconstateerd dat beide rijen overeenkomen, ook al klopt de datum van de tweede rij niet. Waarom? Laten we elke vergelijking vervangen door TRUE of FALSE:
TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE
Als OR een hogere prioriteit had, zou het als volgt worden geëvalueerd:
TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)
Aangezien elke waarde gecombineerd met OR TRUE TRUE oplevert, zou de subexpressie tussen deze haakjes worden gereduceerd tot:
TRUE AND (TRUE)
FALSE AND (TRUE)
En de tweede rij zou niet overeenkomen, omdat FALSE AND TRUE FALSE oplevert. Maar dat kan niet zo zijn, aangezien je de tweede rij foutief gevonden hebt.
In feite heeft AND een hogere prioriteit dan OR, dus het evalueert echt alsof er haakjes rond de AND-subexpressie staan:
(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE
Wat reduceert tot:
(FALSE) OR TRUE
(FALSE) OR TRUE
In beide gevallen levert ONWAAR OF WAAR WAAR op, en beide rijen komen overeen.
Dus zonder haakjes is de standaardsemantiek dat AND een hogere prioriteit heeft dan OR. Je hebt de haakjes nodig:
WHERE BookingInfo.BookingDate = '2010-05-18' AND
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')