2013-01-23 8 views
1

У меня есть этот SQL запрос, который продолжает съемки мне ошибку:Я использую MATCH() правильно?

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OR description IN BOOLEAN MODE) ORDER BY datetime ASC LIMIT 0,20' at line 4

Это запрос, я пытаюсь запустить:

$items = $itemsClass->getAll($start , $limit, " `status` = 'active' AND MATCH (".sql_quote($s).") AGAINST (`name` OR `description` IN BOOLEAN MODE) ".$whereQuery, "$order"); 

Почему: Я работаю на функции поиска для веб-сайт, и когда мы ищем определенное ключевое слово (то есть торт), оно отображает релевантные элементы. Но, когда мы ищем «cook», который также находится в том же названии/описании, что и элемент торта, он не приводит к каким-либо результатам и говорит, что он пуст.

Я не могу понять, почему я получаю эту ошибку для запроса. Я просто пытаюсь найти решение моей проблемы. Я использую MySQL 5.1.66.

+0

Пожалуйста, разместите _query_, без PHP-ness. Вы можете абстрагировать PHP, чтобы оставить только фактический запрос MySQL, который вы используете. –

ответ

1

Прежде всего, вы указываете имена столбцов в функции MATCH(), а также шаблоны в функции AGAINST(). Вы делаете это неправильно.

Во-вторых, поиск по нескольким столбцам является неявным «OR» сравнением, так как сопоставление ключевых слов в любого из индексированных столбцов считается совпадением.

Таким образом, вы должны использовать:

... MATCH (`name`, `description`) AGAINST (".sql_quote($s).") IN BOOLEAN MODE)" 

Столбцы вы имя в функции MATCH() должны быть все столбцы, определенные в индексе полнотекстового, и в том же порядке, как они появляются в индексе.

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

... MATCH (`name`) AGAINST (".sql_quote($s).") IN BOOLEAN MODE) 
    OR 
    MATCH (`description`) AGAINST (".sql_quote($s).") IN BOOLEAN MODE)" 
+0

Спасибо, много. Это сработало. – user1086337

0

Вы писали:

MATCH ("your string") AGAINST (`name` OR `description` IN BOOLEAN MODE) 

Однако AGAINST (как и другие операторы) не таким образом associative. Выражение, которое оно принимает, - это только выражение —; использование соединителей, таких как OR, не разворачивается для применения к более широкой операции, но используется просто для оценки окончательного выражения.

Таким образом, как правило, вы должны поместить соединительную ORвне вызова оператора:

MATCH ("your string") AGAINST `name` IN BOOLEAN MODE 
OR 
MATCH ("your string") AGAINST `description` IN BOOLEAN MODE 

Однако, в этом случае вы также коммутируемой the operands to MATCH.

Запись:

MATCH (`name`) AGAINST "your string" IN BOOLEAN MODE 
OR 
MATCH (`description`) AGAINST "your string" IN BOOLEAN MODE 

И так случилось, что по своей сути MATCH поддерживает поиск нескольких столбцов.


Итак, в конце концов:

MATCH (`name`, `description`) AGAINST "your string" IN BOOLEAN MODE 

Мораль этой истории является то, что документация является вашим другом.

+0

По-видимому, документация сегодня не была моей подругой, так как это было первое место, где я смотрел. :) Спасибо за помощь, хотя. – user1086337

Смежные вопросы