我有这个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。
答案 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
故事的寓意是文档是你的朋友。