PHP SQL SELECT,其中包含多个单词的搜索项

时间:2010-09-01 19:09:13

标签: php sql mysql select

我有一个选择,如查询搜索表单,如下所示:

<?php 
$bucketsearch = sanitizeone($_POST["bucketsearch"], "plain");
$bucketsearch = strip_word_html($bucketsearch);
?>

 if(isset($_POST['search'])){
                  $result=MYSQL_QUERY( "SELECT * FROM buckets where bucketname like '%$bucketsearch%' order by bucketname");
              }else{
              $result=MYSQL_QUERY( "SELECT * FROM buckets order by bucketname");
          }

我的问题是,如果有人搜索“苹果和梨”的实例,我没有得到任何包含任何单词的结果,我只能让它返回结果(1个结果)及其中的所有单词。

任何人都可以帮我把这个搜索更多一些吗? 提前致谢。

6 个答案:

答案 0 :(得分:30)

所以你想要使用输入的每个单词进行AND搜索,而不是确切的字符串?怎么样这样:

$searchTerms = explode(' ', $bucketsearch);
$searchTermBits = array();
foreach ($searchTerms as $term) {
    $term = trim($term);
    if (!empty($term)) {
        $searchTermBits[] = "bucketname LIKE '%$term%'";
    }
}

...

$result = mysql_query("SELECT * FROM buckets WHERE ".implode(' AND ', $searchTermBits).");

这将为您提供如下查询:

SELECT * FROM buckets WHERE bucketname LIKE '%apple%' AND bucketname LIKE '%and%' AND bucketname LIKE '%pear%'

如果要匹配任何搜索词而不是全部,请将AND更改为OR。进一步的改进可能涉及定义一些停止词,如'和',以提供更好的结果。

答案 1 :(得分:7)

我认为最好的解决方案是使用正则表达式。它是最干净的,可能是最有效的。所有常用的数据库引擎都支持正则表达式。

在MySQL中有RLIKE运算符,因此您的查询将类似于:

SELECT * FROM buckets WHERE bucketname RLIKE "(?=.*apple)(?=.*and)(?=.*pear)"

没有测试过,希望我的表达式适用于MySQL正则表达式“方言”。

更多关于MySql正则表达式的支持:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

答案 2 :(得分:1)

对于你这里的简单案例,你可以用“%”替换你的“和”(但我猜你正在寻找一个更全面的答案。(这也是具体的订单,因为苹果必须来梨之前。)

答案 3 :(得分:1)

尔。不是我想的最好的解决方案,但你可以将这些单词分解成一个数组并将它们循环到多个LIKES中。做一些替换以取出AND,OR等,然后进行爆炸。

然后循环。

$ sql = SELECT *来自Buckets,其中“;

循环数组, $ sql。=“bucketname LIKE'%”。 $ arrayEl [i]。 “%OR”。只需确保在最后一次迭代中不包括最后一个OR或追加最后一行0 = 1等。

不优雅,效率不高但在这种情况下它会起作用。如果它是一个文本字段,你真的会更好地运行全文搜索。

答案 4 :(得分:1)

我希望在MySQL数据库中使用基本SQL进行多字搜索。所以我想出了以下内容。

$terms=explode(" ",$search);
$count=count($terms);
$sql="SELECT * FROM product WHERE";                     
for($i=0;$i<$count;$i++)
{
    if($i!=$count-1)
        $sql = $sql.
        " (pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR    
          sub_category LIKE '%$terms[$i]%' OR 
          description LIKE '%$terms[$i]%') AND ";
    else
        $sql = $sql.
        "(pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR 
         sub_category LIKE '%$terms[$i]%' OR 
         description LIKE '%$terms[$i]%')";
}    

答案 5 :(得分:0)

你可以将“苹果和梨”分成2个字符串; “苹果”和“梨”。也许,那么你可以做WHERE bucketname LIKE '%apple%' OR bucketname LIKE '%pear%'。我不知道这是否有帮助。