Как можно реализовать SQL запрос для поиска по двум столбцам одновременно с исключением некоторых столбцов из поиска?
Имеется БД 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 это ИЛИ
выбираются всегда все колонки которые в запросе а клиент уже их может игнорировать
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 (стандарт
Ваш пример будет работать не совсем так... точнее, не будет выдавать результатов поиска вообще, т.к. текст запроса один и тот же, что для 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>%'
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'.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для реализации SQL запроса для поиска по двум столбцам одновременно с исключением некоторых столбцов из поиска, мы можем использовать операторы SELECT и WHERE в комбинации с логическими операторами AND и NOT. Вот пример SQL запроса для этой задачи:
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 запросе. Если у вас есть дополнительные вопросы, не стесняйтесь задавать!