首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP SQL SELECT where like包含多个单词的搜索项目

问PHP SQL SELECT where like包含多个单词的搜索项目
EN

Stack Overflow用户
提问于 2010-09-02 03:09:13
回答 6查看 46.6K关注 0票数 8

我有一个select where like查询用于搜索表单,如下所示:

代码语言:javascript
复制
<?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");
          }

我的问题是,如果有人搜索"apple and pear“,我没有得到任何包含任何单词的结果,我只能让它返回包含所有单词的结果(好吧,1个结果)。

有没有人能帮我把这个搜索做得更精准一点?提前谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-02 03:17:02

因此,您希望使用输入的每个单词进行AND搜索,而不是使用确切的字符串?像这样的事情怎么样:

代码语言:javascript
复制
$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).");

这将为您提供如下查询:

代码语言:javascript
复制
SELECT * FROM buckets WHERE bucketname LIKE '%apple%' AND bucketname LIKE '%and%' AND bucketname LIKE '%pear%'

如果要匹配任何搜索词而不是所有搜索词,请将AND更改为OR。进一步的改进可能涉及定义一些停用词,如“and”,以提供更好的结果。

票数 34
EN

Stack Overflow用户

发布于 2012-12-07 20:38:14

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

在MySQL中有RLIKE运算符,因此您的查询将如下所示:

代码语言:javascript
复制
SELECT * FROM buckets WHERE bucketname RLIKE "(?=.*apple)(?=.*and)(?=.*pear)"

没有测试它,希望我的表达式是正确的MySQL正则表达式“方言”。

有关MySql正则表达式支持的更多信息:

http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

票数 7
EN

Stack Overflow用户

发布于 2010-09-02 03:14:37

对于这里的简单情况,您可以将"and“替换为"%”(但我猜您正在寻找更全面的答案。(这也是特定于订单的,因为苹果必须先于梨。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3621310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档