Почему я получаю неправильный результат из этого SQL-запроса? - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь создать простой скрипт поиска.

Итак, я написал следующее:

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 голосов
/ 07 ноября 2018

Вы должны применять свои условия 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%')
0 голосов
/ 07 ноября 2018

Вам нужны скобки:

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[[:>:]]');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...