Mysql
 sql >> база данни >  >> RDS >> Mysql

Нуждаете се от помощ с правилния SQL

Прегледайте реда на приоритет между И и ИЛИ.

В аритметиката умножението има по-голям приоритет от събирането.

Пример: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')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на данни от две таблици, първата таблица, текстови данни, втора таблица, медийни изображения. изображенията се провалят

  2. SQLSTATE[22007]:Невалиден формат за дата и час:1292 Неправилна стойност за дата и час:'2019-03-31 01:52:25'

  3. Как да избера NULL, ако няма данни и да покажа данните, ако съществуват?

  4. Как да инсталирате MySQL на CentOS 7

  5. Грешка в заявката на Python/MySQL:„Неизвестна колона“.