小编典典

PHP / MySql“高级搜索”页面

sql

我正在网站的“高级搜索”页面上工作,您将在其中输入诸如“我喜欢苹果”之类的关键字,并且它可以使用以下选项搜索数据库:

查找:使用所有单词,使用确切的短语,使用至少一个单词,不使用单词

我可以通过以下方式来处理“精确短语”:

SELECT * FROM myTable WHERE field='$keyword';

“至少一个词”由:

SELECT * FROM myTable WHERE field LIKE '%$keyword%';//Let me know if this is the wrong approach

但是我坚持的是“至少有一个词”和“没有这些词”。

关于如何实现这两个方面的任何建议?

编辑: 关于“至少一个单词”,使用explode()将关键字分解为单词并运行循环以添加不是一个好方法

(field='$keywords') OR ($field='$keywords) (OR)....

因为查询中还有一些其他AND / OR子句,但我不知道可以有的最大子句数。


阅读 147

收藏
2021-04-15

共1个答案

小编典典

我建议将MySQL FullText SearchBoolean Full-Text
Searches
功能配合使用,您应该能够获得所需的结果。

编辑:

根据您所要求的条件提出的示例(“它只是一个字段,他们可以选择4个选项中的任意一个(即1个单词,确切的单词,至少1个单词,不带术语)。”)

我假设您正在根据您的初始帖子使用php

<?php
$choice = $_POST['choice'];
$query = $_POST['query'];

if ($choice == "oneWord") {
    //Not 100% sure what you mean by one word but this is the simplest form
    //This assumes $query = a single word
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "exactWords") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('\"{$query}\"' IN BOOLEAN MODE)");
} elseif ($choice == "atLeastOneWord") {
    //The default with no operators if given multiple words will return rows that contains at least one of the words
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "withoutTheTerm") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('-{$query}' IN BOOLEAN MODE)");
}
?>

希望这有助于在布尔匹配中充分利用运算符

2021-04-15