MySQL возвращает неверные результаты с предложением BETWEEN - PullRequest
3 голосов
/ 30 марта 2019

Я использую следующий запрос для получения данных из базы данных 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.

enter image description here

Ответы [ 3 ]

4 голосов
/ 30 марта 2019

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

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

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 голосов
/ 30 марта 2019

Всегда полезно установить логический приоритет 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 была вашей предполагаемой логикой, добавление скобок прояснит ваше намерение следующему человеку, который смотрит на запрос.

0 голосов
/ 15 мая 2019

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

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

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

...