MySQL - 如何在此全文搜索中插入额外的where子句

Ste*_*ven 0 mysql full-text-search

我想在全文搜索查询中添加一个WHERE子句(限制为过去24小时),但无论我在哪里插入它都会出现低级错误.是否可以添加该条款,如果是,如何?这是没有where子句的代码:

        $query = "SELECT *, MATCH (story_title) AGAINST ('$query' IN BOOLEAN MODE) 
AS Relevance FROM stories WHERE MATCH (story_title) AGAINST ('+$query' IN BOOLEAN MODE)
 HAVING Relevance > 0.2 ORDER BY Relevance DESC, story_time DESC;
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 5

首先,提出问题的一些提示:

  • 使用换行符.与像Java这样的语言不同,PHP支持带换行符的字符串文字.格式化SQL使其更易于阅读,调试和维护.

  • 显示SQL. 您在该查询中嵌入了PHP变量扩展,这与您的问题无关.这使得人们更难以破译你想要问的内容.显示要调试的代码,而不是生成代码的代码.

现在关于你的查询:

  • 你不能只在WHERE任何地方添加一个额外的条款.WHERE使用AND运算符向现有子句添加额外的术语.

  • 嵌入调用以$_GET在同一查询中多次验证同一参数似乎很浪费.使用变量来保留验证参数的结果.

  • 利用短路评估.将最便宜的条件(例如那些受益于传统指数的条件)放在最左边.

  • 布尔模式下的 MySQL全文搜索不返回相关性.您必须使用自然语言模式来获取0和1之间的相关性值.

  • 将条件放在HAVING子句而不是WHERE子句中会使其更容易,因为您可以使用在SELECT列表中定义的列别名,但这可能会使查询执行得更糟. HAVING用于在组之后放置条件以包括在GROUP BY子句之后. WHERE用于在行上放置条件以包含在查询结果中.

  • 如果MATCH()WHERE子句中使用自然语言模式,则行按相关性顺序自动排序.如果平局的可能性很低,您可以跳过您的ORDER BY子句,并使查询更有效.

这是我写这段代码的方法:

$q = validate_input($_GET["q"]);
$bsearch = $pdo->quote("+{$q}");
$nlsearch = $pdo->quote($q);
$stories_table = $config["db"]["pre"] . "stories";
$offset = validate_input(($_GET["page"]-1)*10);

$query = "
  SELECT *, MATCH (story_title) AGAINST ({$nlsearch}) AS Relevance 
  FROM {$stories_table} 
  WHERE story_time > time()-86400
    AND MATCH (story_title) AGAINST ({$bsearch} IN BOOLEAN MODE) 
    AND MATCH (story_title) AGAINST ({$nlsearch}) > 0.2
  LIMIT {$offset}, 10";
Run Code Online (Sandbox Code Playgroud)

  • 你能否提供"不起作用"的更多细节?很难再提出任何建议.你能编辑上面的问题并添加你正在执行的确切查询(在所有PHP代码生成之后)和确切的错误消息吗?还有一些细节,比如什么版本的MySQL以及你如何从PHP执行查询. (2认同)