Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Potrzebujesz pomocy z poprawnym SQL

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')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego wiele zapytań MySql powoduje błąd składni, podczas gdy osobno działają pomyślnie?

  2. Problem z dodaniem dwóch kolumn mysql i zwróceniem sumy

  3. wiele zapytań w tej samej tabeli, ale w różnych kolumnach mysql

  4. Zliczanie wartości nieciągłych

  5. Ustaw PDO, aby domyślnie zgłaszało wyjątki