Почему мой запрос MySQL MATCH () AGAINST () не выполняется со столбцами из баз данных LEFT JOIN'd? - PullRequest
4 голосов
/ 11 ноября 2009

У меня есть запрос MySQL, похожий на следующий:

SELECT * 
FROM products 
LEFT JOIN descriptions ON products.DescriptionID = descriptions.ID 
WHERE MATCH (name, overview, specs) AGAINST ('ram');

Все столбцы, которые я пытаюсь найти с помощью MATCH() AGAINST(), являются FULLTEXT, но я получаю следующую ошибку при тестировании в phpMyAdmin:

#1210 - Incorrect arguments to MATCH

Если я только MATCH один столбец, это не ошибка и работает правильно, но как только я пытаюсь MATCH несколько столбцов, это не с этой ошибкой. Я использую MySQL 5.0.45, а документация Функции полнотекстового поиска MySQL 5.0 предполагает, что я могу это сделать.

Это из-за LEFT JOIN? Нужно ли OR собрать кучу MATCH() AGAINST() вызовов функций?

Обновление @Zak: Я не могу опубликовать операторы создания таблицы, но могу сказать, что в этом примере столбцы выглядят следующим образом: products.name, descriptions.overview, descriptions.specs. Если я укажу их в полном формате table.column, это не изменит поведение.

Однако, если я проиграю products.name из MATCH(), я получаю следующую ошибку:

#1191 - Can't find FULLTEXT index matching the column list

Но и descriptions.overview, и descriptions.specs являются ПОЛНЫМИ ТЕКСТАМИ.

Ответы [ 2 ]

13 голосов
/ 11 ноября 2009

Аргументы для MATCH() должны быть такими же столбцами в определении индекса FULLTEXT. Они должны быть одинаковыми по количеству и положению.

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

Если вы хотите искать текстовые столбцы из разных таблиц, вам нужно будет создать индекс FULLTEXT в каждой таблице, а затем искать каждый индекс с помощью отдельного вызова MATCH(). Используйте OR выражения для объединения результатов.

6 голосов
/ 11 ноября 2009

Я столкнулся с той же проблемой. Дело в том, что вы не можете сопоставить столбцы из разных таблиц, поэтому вам нужно разделить запрос.

Попробуйте что-то вроде этого (отредактировано для соответствия столбцам и таблицам):

SELECT p.name, d.overview, d.specs
FROM products AS p 
LEFT JOIN descriptions AS d ON p.DescriptionID = d.ID 
WHERE MATCH (p.name) AGAINST ('ram')
OR MATCH (d.overview, d.specs) AGAINST ('ram');

Надеюсь, это поможет!

...