Как можно реализовать SQL запрос для поиска по двум столбцам одновременно с исключением некоторых столбцов из поиска?

Ссылка скопирована
15 января 2026 1 ответ

Имеется БД SQLite, а в ней заполненная таблица(data) FTS5 со столбцами: a, b, c
Содержимое таблицы для примера:
a|b|c
Что АБЫРВАЛГ может|ГЛАВРЫБА|Тузик

Мне необходимо осуществить поиск ТОЛЬКО по столбцам 'a' и 'b', при этом в запросе должен присутствовать и столбец 'с'.
Если использую запрос:

$stmt = $db->prepare("SELECT a, b, c FROM data WHERE data MATCH 'a:$fullQuery OR b:$fullQuery' ORDER BY id DESC LIMIT 5"); $stmt->bindValue(':fullQuery',$fullQuery, SQLITE3_TEXT);

$stmt = $db->prepare("SELECT a, b, c FROM data WHERE data MATCH 'a:$fullQuery OR b:$fullQuery' ORDER BY id DESC LIMIT 5"); $stmt->bindValue(':fullQuery',$fullQuery, SQLITE3_TEXT);

Так он ищет по столбцам 'a', 'b' и 'c'
Например, введя запрос: "Что ГЛАВРЫБА может" - результат: "Что АБЫРВАЛГ может"
но результат даст и запрос: "Что Тузик может" - результат: "Что АБЫРВАЛГ может"

Если же исключаю столбец 'c':

SELECT a, b, c FROM data WHERE (a MATCH '{$fullQuery}' OR b MATCH '{$fullQuery}') ORDER BY id DESC LIMIT 5");

SELECT a, b, c FROM data WHERE (a MATCH '{$fullQuery}' OR b MATCH '{$fullQuery}') ORDER BY id DESC LIMIT 5");

то как и требовалось, столбец 'c' не задействуется в поиске, но и не происходит поиск одновременно по столбцам 'a', 'b'. Либо по 'a,' либо по 'b'.
Например, введя запрос: "Что ГЛАВРЫБА может" - не даст результата, а дает результат только "Что АБЫРВАЛГ может" или "ГЛАВРЫБА".

Требуется, что бы работал такой запрос: "Что ГЛАВРЫБА может" - результат: "Что АБЫРВАЛГ может"(без участия в поиске столбца 'c' )

Дополнительно:

одновременно по столбцам 'a', 'b'. Либо по 'a,' либо по 'b'.

перефразируйте чего хотите
OR это ИЛИ

выбираются всегда все колонки которые в запросе а клиент уже их может игнорировать

  • И вот эта вся войнаимир - только потому, что OR где-то видел, а AND - нет?..
  • Adamos, ну как же, видел, пробовал. Вообще не выдает результатов с оператором AND.
  • сергей кузьмин, если исключаю столбец 'c':
    SELECT a, b, c FROM data WHERE (a MATCH '{$fullQuery}' OR b MATCH '{$fullQuery}') ORDER BY id DESC LIMIT 5");
    то как и требовалось, столбец 'c' не задействуется в поиске, но и не происходит поиск одновременно по столбцам 'a', 'b'. С этим запросом происходит поиск либо по 'a,' либо по 'b'.

    А вот этот запрос, как и требуется дает возможность осуществлять поиск по всем столбцам одновременно: "SELECT a, b, c FROM data WHERE data MATCH 'a:$fullQuery OR b:$fullQuery' ORDER BY id DESC LIMIT 5"); но он ищет еще и по столбцу 'c'(от чего и хочу избавиться). Но при этом в SELECT столбец 'c' должен быть указан.

  • спасибозапояснение

    структура сиквет запроса

    SELECT X,Y,Z FROM T WHERE Z LIKE '%TEXT1%' AND Y LIKE '%TEXT2%'

    SELECT X,Y,Z FROM T WHERE Z LIKE '%TEXT1%' AND Y LIKE '%TEXT2%'

    и не надо MATCH (нестандарт) лучше LIKE (стандарт

  • сергей кузьмин, в том то и суть, что требуется через MATCH...

    Ваш пример будет работать не совсем так... точнее, не будет выдавать результатов поиска вообще, т.к. текст запроса один и тот же, что для Z, что для Y.

    SELECT X,Y,Z FROM T WHERE Z LIKE '%TEXT<b>1</b>%' AND Y LIKE '%TEXT<b>1</b>%'

    SELECT X,Y,Z FROM T WHERE Z LIKE '%TEXT<b>1</b>%' AND Y LIKE '%TEXT<b>1</b>%'

  • Александр Вишнев, это вы кого пытаетесь убедить про мач ?

    Как можно реализовать SQL запрос для поиска по двум столбцам одновременно с исключением некоторых столбцов из поиска?

    https://www.sqlite.org/lang_expr.html
    на дерево посмотирте

  • Ответы:

    Для выполнения поиска по двум столбцам в SQLite с использованием FTS5 и исключением одного столбца из поиска, вы можете использовать следующий запрос:

    SELECT a, b, c FROM data WHERE data MATCH 'a:$fullQuery OR b:$fullQuery' AND NOT c:$fullQuery;

    SELECT a, b, c FROM data WHERE data MATCH 'a:$fullQuery OR b:$fullQuery' AND NOT c:$fullQuery;

    этом запросе используется оператор MATCH для поиска по столбцам a и b с использованием переменной $fullQuery. Оператор AND NOT исключает результаты, где столбец c также соответствует запросу $fullQuery.

    Таким образом, если $fullQuery содержит “Что ГЛАВРЫБА может”, запрос вернет строки, где a или b содержат эту фразу, но c не содержит её. Это позволит вам исключить столбец c из поиска, но при этом включить его в выводимые результаты. Пожалуйста, убедитесь, что ваш запрос корректно обрабатывает специальные символы и пробелы в $fullQuery.

    • SELECT a, b, c FROM data WHERE data MATCH 'a:Что*Тузик*  OR b:Что*Тузик* ' AND NOT 'c:Что*Тузик* ';

      SELECT a, b, c FROM data WHERE data MATCH 'a:Что*Тузик* OR b:Что*Тузик* ' AND NOT 'c:Что*Тузик* ';

      Попробовал так, но он все так же продолжает учитывать при поиске текст из столбца 'c'.

    • Для исключения столбца c из поиска в FTS5, вы можете использовать оператор NOTв сочетании с запросом MATCH. Однако, важно правильно сформировать запрос, чтобы он корректно интерпретировался. Вот пример запроса, который исключает столбец c из поиска:
      SELECT a, b, c FROM data WHERE data MATCH 'a:Что*Тузик* OR b:Что*Тузик*' AND NOT data MATCH 'c:Что*Тузик*';

      SELECT a, b, c FROM data WHERE data MATCH 'a:Что*Тузик* OR b:Что*Тузик*' AND NOT data MATCH 'c:Что*Тузик*';

      В этом запросе, мы используем MATCHдля столбцов a и b с вашим поисковым запросом, и затем исключаем результаты, где столбец c также соответствует этому запросу. Обратите внимание, что NOT применяется к всему выражению MATCH, а не к отдельным словам внутри него.

    • Azamat Lee, не, что-то не то...

      Ошибка при выполнении SQL запроса к базе данных 'datai': unable to use function MATCH in the requested context

      Ругается на использование MATCH в AND NOT data MATCH 'c:Что*Тузик*';

    • В документации SQLite указано, что для исключения определенных столбцов из поиска можно использовать синтаксис с минусом перед именем столбца. Например, чтобы исключить столбец c из поиска
      SELECT a, b, c FROM data WHERE data MATCH 'Что*Тузик* -c:*';

      SELECT a, b, c FROM data WHERE data MATCH 'Что*Тузик* -c:*';

    • Azamat Lee, да, то что надо! Спасибо!
      SELECT a, b, c, d, e FROM data WHERE data MATCH '- c: ($fullQuery)'; // Исключает столбец 'c'  SELECT a, b, c, d, e FROM data WHERE data MATCH '- {c d e} : ($fullQuery)';  // Исключает столбцы 'c',  'd',  'e'.

      SELECT a, b, c, d, e FROM data WHERE data MATCH '- c: ($fullQuery)'; // Исключает столбец 'c' SELECT a, b, c, d, e FROM data WHERE data MATCH '- {c d e} : ($fullQuery)'; // Исключает столбцы 'c', 'd', 'e'.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Андрей PHP Ответ

    Для реализации SQL запроса для поиска по двум столбцам одновременно с исключением некоторых столбцов из поиска, мы можем использовать операторы SELECT и WHERE в комбинации с логическими операторами AND и NOT. Вот пример SQL запроса для этой задачи:

    SELECT * 
    FROM TABLE_NAME 
    WHERE (column1 = 'value1' OR column2 = 'value2') 
    AND column3 != 'value3' 
    AND column4 != 'value4';

    SELECT * FROM table_name WHERE (column1 = 'value1' OR column2 = 'value2') AND column3 != 'value3' AND column4 != 'value4';

    В этом запросе мы выбираем все строки из таблицы `table_name`, где значение в `column1` равно 'value1' ИЛИ значение в `column2` равно 'value2', и при этом значение в `column3` НЕ равно 'value3', и значение в `column4` НЕ равно 'value4'.

    Вы можете настраивать этот запрос, заменяя имена столбцов и значения на соответствующие в вашей базе данных. Также вы можете добавлять другие условия для более сложного поиска.

    Надеюсь, это поможет вам реализовать поиск по двум столбцам одновременно с исключением определенных столбцов из поиска в вашем SQL запросе. Если у вас есть дополнительные вопросы, не стесняйтесь задавать!

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно