为什么我从此SQL查询中得到错误的结果?

时间:2018-11-07 10:44:13

标签: mysql sql database

我正在尝试创建一个简单的搜索脚本。

所以我写了以下内容:

SELECT *
FROM snm_content
WHERE
    state = 1 AND
    `catid` NOT IN ('15', '23') AND
    `title` LIKE '%test%' OR `introtext` LIKE '%test%' OR `fulltext` LIKE '%test%'

第一次检查WHERE state = 1失败,我得到的结果为-2。怎么可能呢?

这是我在PHPmyadmin中使用查询时的结果:

enter image description here

当清楚地写state必须是1时,如何仍能得到该结果。

2 个答案:

答案 0 :(得分:4)

您需要在括号内应用OR子句

SELECT * FROM snm_content WHERE state = 1 AND `catid` NOT IN ('15', '23') AND 
(`title` LIKE '%test%' OR `introtext` LIKE '%test%' OR `fulltext` LIKE '%test%')

答案 1 :(得分:2)

您需要括号:

SELECT *
FROM snm_content
WHERE
    state = 1 AND
    catid NOT IN (15, 23) AND
    (title LIKE '%test%' OR introtext LIKE '%test%' OR fulltext LIKE '%test%');

由于操作规则的顺序,您当前的WHERE子句被解释为:

WHERE
    ((state = 1 AND
    catid NOT IN (15, 23)) AND
    title LIKE '%test%') OR introtext LIKE '%test%' OR fulltext LIKE '%test%';

也就是说,title字段必须与通配符表达式匹配才能返回任何内容。

顺便说一句,如果您要在这些字段中匹配文字test,请考虑使用REGEXP和单词边界:

SELECT *
FROM snm_content
WHERE
    state = 1 AND
    catid NOT IN (15, 23) AND
    (title REGEXP '[[:<:]]test[[:>:]]' OR introtext REGEXP '[[:<:]]test[[:>:]]' OR
     fulltext REGEXP '[[:<:]]test[[:>:]]');