为什么我从这个sql查询中得到错误的结果?

jdgnovmf  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(298)

我正在尝试创建一个简单的搜索脚本。
所以我写了以下内容:

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中使用查询时得到的结果:

当我清楚地写的时候,我怎么还能得到那个结果呢 state 必须是 1 .

zbdgwd5y

zbdgwd5y1#

你需要括号:

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[[:>:]]');
kyks70gy

kyks70gy2#

您需要在括号内应用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%')

相关问题