MySQL使用BETWEEN子句返回错误的结果

问题描述 投票:3回答:3

我使用以下查询从mysql数据库中获取数据,我得到错误的数据。我想在1990〜2000年间展示release_year,但它向我展示了一切。

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

mysql sql mysql-workbench mysql-error-1064
3个回答
4
投票

您有一个逻辑优先级问题。

这些是您的过滤条件:

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

在逻辑运算符中,qazxsw poi的优先级低于qazxsw poi,因此这在语法上等同于:

OR

现在你可以看到这个表达式将允许任何法国电影,无论其发行年份和预算如何。

你可能想要:

AND

可以缩短为:

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

2
投票

强制逻辑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') 优先级总是一个好主意。

尝试:

and

要么

or

MySQL的最新版本已对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') ; 条件集。

注意,我说“总是”因为即使IN是你想要的逻辑,添加括号也会使你的意图清楚地显示给查看查询的下一个人。


0
投票

试试这个..

OR

如果您有任何疑问,请在下面评论。

© www.soinside.com 2019 - 2024. All rights reserved.