我在弄清楚为什么下面的SQL查询不起作用时遇到了一些麻烦......当members_only
设置为0时,它仍然显示它们......
SELECT *
FROM reports
WHERE story = "1"
OR barebones = "1"
AND members_only = "1"
答案 0 :(得分:8)
这取决于您的数据,但您可能不知道AND
在SQL中的优先级高于OR
,因此您的查询确实评估为:
SELECT *
FROM reports
WHERE story = '1'
OR (barebones = '1' AND members_only = '1')
考虑在其他答案中使用不同的括号来明确声明您的意图
答案 1 :(得分:4)
使用括号来区分您澄清WHERE条件。
SELECT *
FROM reports
WHERE (story = '1' OR barebones = '1')
AND members_only = '1'
答案 2 :(得分:3)
缺少括号? 你想做这样的事情:
SELECT *
FROM reports
WHERE (story = "1" OR barebones = "1") AND members_only = "1"
答案 3 :(得分:3)
我会说因为它将查询读作:
WHERE (story = '1') OR (barebones = '1' AND members_only = '1')
从story = '1'
起,条件得到满足
OR子句可能很棘手 - 您经常需要明确告诉查询它所属的位置。我想,你想要这个:
WHERE (story = '1' OR barebones = '1') AND members_only = '1'
答案 4 :(得分:2)
您缺少括号。
以下代码将起作用,假设members_only HAS为“1”,但只有 story 或准系统必须为“1”。
SELECT *
FROM reports
WHERE
(story = "1" OR barebones = "1")
AND members_only = "1"
在原始代码中,假设以下内容:
由于运算符优先级,首先计算准系统和* members_only *,并将其计算为false。
在此之后,将第一次布尔评估(false
)(也称为The Right Side
)的结果与(story = "1"
)(也称为The Left Side
)进行比较。
The Right Side
的计算结果为false,但The Left Side
的计算结果为true。
由于最终的布尔压缩使用OR
运算符,因此最终结果为TRUE
,因此无论准系统的值是什么,都会返回该记录。 * members_only *,因为The Left Side
总是评估为True。