SQL (для mysql) получает хорошие результаты, но нужно исключить некоторые столбцы - PullRequest
0 голосов
/ 09 августа 2009

Я пытаюсь написать собственный поиск, который будет искать «все категории» и отдельные категории (через форму / выбрать выпадающий список). У меня проблемы с поиском по моей отдельной категории. Когда я тестирую свой sql, он возвращает хорошие результаты, но я получаю дополнительные / нежелательные категории в моих результатах. Я получаю эти дополнительные категории в моих результатах из-за моих предложений И и ИЛИ.

Например, в моем тестовом запросе «вектор» я получаю результаты по 3 категориям, потому что слово «вектор» появляется в заголовках, описаниях или тегах в 3 отдельных категориях. Я хочу ограничиться показом только соответствующего раздела (который выбирается из выпадающего списка формы / выбора). Так, например, я получаю результаты по категориям 8, 12 и 13, но я хочу показать только категорию 8 (потому что это то, что я выбираю в моей форме / раскрывающемся списке - это мое предложение WHERE ниже).

Мои результаты имеют смысл, но я не уверен, как показывать только результаты из категории 8 (в моем тестовом примере). Я в основном хочу выполнить дополнительную фильтрацию, чтобы уменьшить результирующий набор только до категории 8.

SELECT title,category 
FROM stories 
WHERE category=8 
AND title LIKE '%vector%' 
OR desc LIKE '%vector%' OR tags LIKE '%vector%' 
ORDER BY time DESC

Ответы [ 4 ]

3 голосов
/ 09 августа 2009

У вас небольшая проблема с приоритетом вашего оператора. AND имеет более высокий приоритет, чем OR, поэтому ваш запрос в настоящее время анализируется следующим образом:

SELECT title,category 
FROM stories 
WHERE (category=8 AND title LIKE '%vector%')
OR desc LIKE '%vector%' OR tags LIKE '%vector%' 
ORDER BY time DESC

Что вы действительно хотите, так это запрос:

SELECT title,category 
FROM stories 
WHERE category=8 
AND
(title LIKE '%vector%' OR desc LIKE '%vector%' OR tags LIKE '%vector%')
ORDER BY time DESC

Дополнительная информация о приоритете операторов в MySQL доступна в документации:

11.2.1: приоритет оператора

1 голос
/ 09 августа 2009

просто добавьте соответствующие скобки:

SELECT title,category 
FROM stories 
WHERE category=8 
AND (title LIKE '%vector%' 
 OR desc LIKE '%vector%' OR tags LIKE '%vector%')
ORDER BY time DESC
0 голосов
/ 09 августа 2009

Отсутствуют скобки?

Попробуйте

SELECT title,category  
FROM stories 
WHERE category=8 
AND (title LIKE '%vector%' 
OR desc LIKE '%vector%' OR tags LIKE '%vector%') 
ORDER BY time DESC
0 голосов
/ 09 августа 2009

Я могу ошибаться, но на основе списка столбцов из бита SELECT запроса столбец категории называется category, но в предложении WHERE это cat. Должны ли они оба быть category? В качестве идентификатора, если вы знаете , что категория 8, зачем вам выбирать ее из базы данных?

Но, что более важно, вы должны заключить в скобки свою логику в предложении WHERE, возможно, что-то вроде:

WHERE
    category=8
    AND (
        title LIKE '%vector%' OR
        desc LIKE '%vector%' OR
        tags LIKE '%vector%'
    )

Таким образом, категория всегда будет частью запроса, но должен совпадать только один из битов title / desc / tags.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...