4

我有一个类似于以下的 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 Full-Text Search Functions文档暗示我可以做到这一点。

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全文。

4

2 回答 2

15

的参数MATCH()必须是 FULLTEXT 索引定义中的相同列。它们的数量和位置必须相同。

此外,由于您无法使用来自不同表的多个列创建索引,因此无法在一次MATCH()调用中匹配来自不同表的列。

如果要从不同的表中搜索文本列,则必须在每个表中创建一个 FULLTEXT 索引,然后使用单独的MATCH()调用搜索每个索引。使用OR表达式组合结果。

于 2009-11-10T23:41:40.913 回答
6

我遇到了同样的问题。问题是您无法匹配来自不同表的列,因此您必须拆分查询。

尝试这样的事情(编辑以匹配列和表):

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');

希望能帮助到你!

于 2009-11-10T23:47:08.263 回答