MySQL возвращает неправильные результаты с предложением BETWEEN

#mysql #sql #mysql-workbench #mysql-error-1064

#mysql #sql #mysql-workbench #mysql-ошибка-1064

Вопрос:

Я использую следующий запрос для получения данных из базы данных mysql и получаю неправильные данные. Я хочу показать release_year с 1990 по 2000 год, но он показывает мне все.

 SELECT title,release_year
FROM FILMS
WHERE 
    release_year BETWEEN 1990 AND 2000
    AND budget > 1000000000
    AND language ='Spanish'
    OR language = 'French';
  

Я попытался изменить порядок запроса, но, похоже, это не сработало, или я попытался добавить круглые скобки в release_year between 1990 AND 2000 .

введите описание изображения здесь

Ответ №1:

У вас проблема с логическим предварением.

Это ваши условия фильтрации:

 release_year BETWEEN 1990 AND 2000 
AND budget > 1000000000 
AND language ='Spanish'
OR language = 'French'
  

В логических операторах, OR имеет меньшую последовательность, чем AND , так что это синтаксически эквивалентно:

 ( 
    release_year BETWEEN 1990 AND 2000 
    AND budget > 1000000000 
    AND language ='Spanish'
)
OR language = 'French'
  

Теперь вы можете видеть, что это выражение позволяет использовать любой французский фильм, независимо от года его выпуска и бюджета.

Вы, вероятно, хотите:

 release_year BETWEEN 1990 AND 2000 
AND budget > 1000000000 
AND ( language ='Spanish' OR language = 'French')
  

Которое может быть сокращено как :

 release_year BETWEEN 1990 AND 2000 
AND budget > 1000000000 
AND language IN ('Spanish', 'French')
  

Ответ №2:

Всегда полезно использовать логический and и or приоритет.

Попробуйте:

 SELECT title,release_year 
FROM FILMS 
WHERE release_year between 1990 AND 2000 
AND budget > 1000000000 
AND (language ='Spanish' OR language = 'French')
;
  

или

 SELECT title,release_year 
FROM FILMS 
WHERE release_year between 1990 AND 2000 
AND budget > 1000000000 
AND language IN ('Spanish', 'French')
;
  

В последние версии MySQL были внесены оптимизации, IN которые могут повысить его производительность по сравнению с эквивалентным набором OR условий.

Обратите внимание, я говорю «всегда», потому что, даже если (a and b) or c это была ваша предполагаемая логика, добавление круглой скобки делает ваше намерение понятным для следующего пользователя, который просматривает запрос.

Комментарии:

1. У вас есть ссылка на ваш комментарий об оптимизации IN ? Мне было бы интересно посмотреть, что они сделали (не то чтобы им пришлось много делать, учитывая, насколько плохой OR является производительность).

2. @Nick На самом деле у меня нет ссылки на это; это просто то, что я видел, как заявляют другие надежные участники здесь.

Ответ №3:

Попробуйте это..

 SELECT title,release_year 
FROM FILMS WHERE release_year >= 1990 
AND release_year <= 2000 
AND budget > 1000000000 
AND (language ='Spanish' OR language = 'French');
  

Если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте ниже.