1

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

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的“OR descriptionIN BOOLEAN MODE) ORDER BY datetimeASC LIMIT 0,20”附近使用正确的语法

这是我试图运行的查询:

$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。

4

2 回答 2

1

首先,您将列名放入MATCH()函数中,并将模式放入AGAINST()函数中。你做错了。

其次,跨多个列的搜索是隐含的“或”比较,因为任何索引列中的关键字匹配都算作匹配。

所以你应该使用:

... 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)"
于 2013-01-23T20:39:52.910 回答
0

你写了:

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

但是, (与其他运算符一样)以这种方式AGAINST不具有关联性。它所采用的表达方式就是——一个表达方式;诸如此类的连接词的使用OR并未展开以应用于更广泛的操作,而仅用于评估最终表达式。

因此,通常,您必须将连接OR 放在操作员调用之外:

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

但是,在这种情况下,您还将操作数切换为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

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

于 2013-01-23T20:34:04.860 回答