sql >> Database teknologi >  >> RDS >> Mysql

Har brug for hjælp til korrekt SQL

Gennemgå rækkefølgen mellem AND og OR.

I aritmetik har multiplikation højere forrang end addition.

Eksempel:10+10*10 =110, men (10+10)*10 =200.

Det ligner AND og OR. OG har højere forrang end OR, så dette uden parentes:

WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1' 
  OR BookingInfo.ClinicID = '2'

fungerer sådan her:

WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1') 
  OR BookingInfo.ClinicID = '2'

Men du vil have det til at virke sådan her:

WHERE BookingInfo.BookingDate = '05-18-2010' AND 
  (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')

Så sæt i parentes for at sikre, at rækkefølgen fungerer, som du vil have den.

Jeg har også lige bemærket, at du bruger datoer i formatet MM-DD-ÅÅÅÅ, som ikke genkendes af MySQL for bogstaver for dato. Du skal bruge formatet ÅÅÅÅ-MM-DD. Det kan forårsage et andet problem.

SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18

Om din kommentar:

Ja, jeg er sikker på, OG har højere forrang end OR. For det første er rangordenshierarkiet for alle operatører i MySQL dokumenteret her:http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html

Lad os gennemgå et eksempel med dit oprindeligt angivne problem:

BookingDate   ClinicID 
2010-05-18    2
2008-05-18    2

WHERE BookingInfo.BookingDate = '2010-05-18' AND 
  BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'

Ved at bruge dette udtryk skal kun den første række matche. Men du fandt ud af, at begge rækker matcher, selvom datoen for den anden række ikke er rigtig. Hvorfor? Lad os erstatte hver sammenligning med enten TRUE eller FALSE:

TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE

Hvis OR havde højere prioritet, ville det evaluere sådan her:

TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)

Da enhver værdi kombineret med OR TRUE giver TRUE, vil underudtrykket inden for disse parenteser reduceres til:

TRUE AND (TRUE)
FALSE AND (TRUE)

Og den anden række ville ikke matche, fordi FALSK OG SAND giver FALSK. Men det kan ikke være, da du fandt den anden række forkert matchende.

Faktisk har AND højere forrang end OR, så det vurderes virkelig, som om du havde parenteser omkring AND-underudtrykket:

(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE

Hvilket reducerer til:

(FALSE) OR TRUE
(FALSE) OR TRUE

I begge tilfælde giver FALSK ELLER SAND SAND, og ​​begge rækker matcher.

Så uden parenteser er standardsemantikken, at AND har højere forrang end OR. Du skal bruge parenteserne:

WHERE BookingInfo.BookingDate = '2010-05-18' AND 
  (BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')


  1. Bestem det næste tal i databaseforespørgslen med while loop i php

  2. Sådan får du næststørste eller tredjestørste post fra en tabel

  3. Dynamisk datamaskering i SQL Server for begyndere

  4. Mysql join og sum fordobler resultatet