Вам нужны скобки:
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[[:>:]]');