Cli*_*ote 8 php mysql sql search
我正在网站上的"高级搜索"页面上输入关键字,例如"我喜欢苹果",它可以使用以下选项搜索数据库:
查找:使用所有单词,使用确切的短语,至少有一个单词,没有单词
我可以通过以下方式处理'确切短语':
SELECT * FROM myTable WHERE field='$keyword';
Run Code Online (Sandbox Code Playgroud)
'至少有一个'by:
SELECT * FROM myTable WHERE field LIKE '%$keyword%';//Let me know if this is the wrong approach
Run Code Online (Sandbox Code Playgroud)
但它的'至少有一个词'和'没有词',我坚持.
关于如何实现这两个的任何建议?
编辑:关于'至少一个单词',使用explode()将关键字分解为单词并运行循环来添加不是一个好方法
(field='$keywords') OR ($field='$keywords) (OR)....
Run Code Online (Sandbox Code Playgroud)
因为查询中还有一些其他的AND/OR子句,我不知道可以有的最大子句数.
Mar*_*son 13
我建议使用MySQL FullText Search和布尔全文搜索功能,你应该能够得到你想要的结果.
编辑:
请求的示例基于您请求的条件("它只是一个字段,他们可以选择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)");
}
?>
Run Code Online (Sandbox Code Playgroud)
希望这有助于在布尔匹配中充分使用运算符,请参阅布尔全文搜索