我正确使用MATCH()吗?

时间:2013-01-23 20:30:06

标签: php mysql sql

我有这个SQL查询一直给我一个错误:

  

您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便在第4行的“OR description IN BOOLEAN MODE”附近使用“datetime ASC LIMIT 0,20”附近使用正确的语法

这是我试图运行的查询:

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

为什么:我正在为网站开发搜索功能,当我们搜索某个关键字(即蛋糕)时,它会显示相关项目。但是,当我们搜索与烹饪蛋糕项目相同的标题/描述的“烹饪”时,它不会产生任何结果,并说它是空的。

我似乎无法弄清楚为什么我的查询出现此错误。我只是想找到解决问题的方法。我正在使用MySQL 5.1.66。

2 个答案:

答案 0 :(得分: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)"

答案 1 :(得分: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

故事的寓意是文档是你的朋友。

相关问题