我正在尝试在MySQL数据库上运行查询,但我发现它似乎忽略了“状态”项。
SELECT * FROM `posts`
WHERE
`tags` LIKE '%gda%'
OR `tags` LIKE '%contests%'
OR `tags` LIKE '%merch%'
AND `newsID` != '2134'
AND `status` > '1'
ORDER BY `postDate` DESC LIMIT 5
在那个例子中,即使'status'设置为0,它仍然会拉动项目。我做错了什么?
答案 0 :(得分:7)
问题在于OR
/ AND
条件的优先级。 AND
的优先级高于OR
,这就是为什么它首先评估由AND
(tags-merch,newsID-2134和status-1)连接的所有条件,然后评估两个标签 - gda和tags-contests)。
尝试添加括号:
SELECT *
FROM `posts`
WHERE (`tags` LIKE '%gda%'
OR `tags` LIKE '%contests%'
OR `tags` LIKE '%merch%')
AND `newsID` != '2134'
AND `status` > '1'
ORDER BY `postDate` DESC
LIMIT 5
答案 1 :(得分:1)
SELECT * FROM `posts`
WHERE
( `tags` LIKE '%gda%'
OR `tags` LIKE '%contests%'
OR `tags` LIKE '%merch%')
AND `newsID` != '2134'
AND `status` > '1'
ORDER BY `postDate` DESC LIMIT 5
答案 2 :(得分:1)
也许你应该使用一些括号我不知道你想要什么组合但是试试这个:
SELECT * FROM `posts`
WHERE
( `tags` LIKE '%gda%'
OR `tags` LIKE '%contests%'
OR `tags` LIKE '%merch%'
)
AND `newsID` != '2134'
AND `status` > '1'
ORDER BY `postDate` DESC LIMIT 5
答案 3 :(得分:1)
通常混合OR和AND不是一种明智的做法,因为根据执行顺序得到不同的结果,运算符优先级(例如true or true and false
)可以被评估为(true or true) and false
- 屈服false或true or (true and false)
- 屈服于真。
使用括号分隔OR和AND,执行顺序是显式的,如下所示:
SELECT * FROM `posts`
WHERE (`tags` LIKE '%gda%' OR `tags` LIKE '%contests%' OR `tags` LIKE '%merch%')
AND `newsID` != '2134'
AND `status` > '1'
ORDER BY `postDate` DESC LIMIT 5
答案 4 :(得分:1)
尝试使用括号来强调您的逻辑句子。如:
SELECT *
FROM `posts`
WHERE (`tags` LIKE '%gda%' OR `tags` LIKE '%contests%' OR `tags` LIKE '%merch%')
AND `newsID` != '2134'
AND `status` > '1'
ORDER BY `postDate` DESC LIMIT 5
否则,你的逻辑会丢失。同样使用括号可以更容易地阅读您的SQL句子。