【问题标题】:Searching Database PHP/MYSQL Question搜索数据库 PHP/MYSQL 问题
【发布时间】:2010-06-24 19:58:40
【问题描述】:

现在我只是用一个简单的

WHERE name LIKE '%$ser%'

但我遇到了一个问题 - 假设搜索是测试 123,而“名称”是测试,它没有返回任何结果。知道有什么方法可以解决吗?我做错了吗?

【问题讨论】:

  • 您能解释一下您正在尝试做什么以及为什么您希望搜索“testing 123”会在名称“testing”上给出肯定匹配吗?你什么时候不希望它匹配?

标签: php mysql search


【解决方案1】:

如果您想搜索“测试”或“123”,请使用OR

WHERE (name LIKE '%Testing%' OR name LIKE '%123%')

但是请注意,这将非常慢,因为无法使用索引,并且可能会返回一些您不想要的结果(例如“4123”)。根据您的需要,使用 full text search 或外部数据库索引产品(如 Lucene)可能是更好的选择。

【讨论】:

    【解决方案2】:

    这就是 LIKE 的工作原理 - 它返回 完全 包含搜索字符串的行,并且,如果您使用“%”,则可以选择包含其他内容。

    如果要查看字段是否包含在字符串中,可以这样:

    SELECT * FROM `Table` WHERE  "Testing 123" LIKE CONCAT("%",`name`,"%") 
    

    【讨论】:

    • 不要使用 CONCAT 意味着 - 就像在 LIKE 的左侧使用通配符一样,将确保无法使用索引。
    • 看了拜尔斯先生的回答后,我想我误解了这个问题。我的查询将找到完全包含在搜索词中的所有名称。如果您的目标是找到与搜索词的一部分或另一部分部分匹配的名称,那么这不是您想要做的。
    • 也许......但同样可能你已经正确理解了这个问题。我已经重读了这个问题,但我仍然不知道是什么意思。我认为我们的任何一个答案都可能是正确的解释。我希望 Belgin Fish 能澄清一下。
    • @Mark Byers:看起来他已经把你标记为正确了。很好地解释了这个问题 - 并回答了它。
    【解决方案3】:

    正如 Scott 所提到的,您无法检查搜索是否包含列值,反之亦然。 所以如果$ser = "testing" 和表有一行name = testing 123 它将返回

    对于您要执行的操作,您需要将搜索查询标记为术语,并对它们中的每一个执行 OR 搜索,或者最好还是查看 mysql full text search 以获得更好的方法

    【讨论】:

      【解决方案4】:

      变量$ser替换后,查询为:

      WHERE name LIKE '%Testing 123%'

      您应该构建以单词分隔的查询:

      WHERE name LIKE '%$word[1]%$word[2]%'

      【讨论】:

      • 我很确定这会产生相同的结果。
      • 只有 diff 是 PHP 中的字符串连接 - 不回答问题
      • 由于单词之间的百分比,结果不一样。而且它比使用 OR 和两个like 更准确、更有效。
      【解决方案5】:

      效率不高(如您的示例),但可以按您的意愿工作:

      WHERE name LIKE '%$ser%' OR '$ser' LIKE CONCAT('%', name, '%')
      

      【讨论】:

        【解决方案6】:

        正如 Mark 和其他人所提到的,如果可能,全文搜索方法可能会更好。

        但是,您可以在单词边界上拆分搜索字符串并使用 OR 逻辑 - 但首先检查整个字符串,然后提供扩大搜索范围的选项:

        注意:输入消毒和准备未显示。

        1。查询:

        $sql_where = "WHERE name LIKE '%$ser%'";  
        

        2.如果返回零个结果,请询问用户是否愿意单独查询每个单词。

        3. 如果用户请求“每个单词”搜索,则查询:

        $sql_where = get_sql_where($ser);
        

        (工作)示例代码如下:

        $ser = 'Testing 123';
        $msg = '';
        
        function get_sql_where($ser){
            global $msg;
            $sql_where = '';
            $sql_where_or = '';
        
            $ser = preg_replace("/[[:blank:]]+/"," ", trim($ser)); //replace consecutive spaces with single space
            $search_words = explode(" ", $ser);
        
            if($search_words[0] == ''){
                $msg = 'Search quested was blank.';
            }else{
                $msg = 'Search results for any of the following words:' . implode(', ', $search_words);
                $sql_where = "WHERE name LIKE '%$ser%'";
                foreach($search_words as $word){
                    $sql_where_or .= " OR name LIKE '%$word%'";
                }
            }
        
            return $sql_where . $sql_where_or;
        }
        
        $sql_where = get_sql_where($ser);
        //Run query using $sql_where string
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-23
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 2017-05-21
          相关资源
          最近更新 更多