MySQL在使用BETWEEN语句时返回错误的结果

3
我正在使用以下查询从mysql数据库获取数据,但是我得到了错误的数据。我想显示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中添加括号。

进入图像描述

3个回答

4

你有一个“逻辑优先级”问题。

这些是你的过滤条件:

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

强制逻辑 andor 的优先级总是一个好主意。

尝试:

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是您想要的逻辑,添加括号也可以让下一个查看查询的人清楚地了解您的意图。


你对IN的优化评论有参考资料吗?我很想看看他们做了什么(虽然考虑到OR性能通常很差,他们可能不需要做太多)。 - Nick
@Nick 我并没有具体的参考资料,这只是我在这里看到其他可靠贡献者所说的。 - Uueerdo

0

试试这个...

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

如果您有任何问题,请在下方评论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接