搜索数据库 PHP/MYSQL 问题

3

现在我只是使用一个简单的

WHERE name LIKE '%$ser%'

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


1
你能解释一下你想做什么以及为什么你期望在名称“testing”上搜索“testing 123”会得到一个正匹配吗?还有什么情况下你不希望它匹配? - Mark Byers
6个回答

5
如果你想搜索“Testing”或“123”,请使用OR:
WHERE (name LIKE '%Testing%' OR name LIKE '%123%')

请注意,由于无法使用索引,这种方法将非常缓慢,而且可能返回一些您不想要的结果(如“4123”)。根据您的需求,使用全文本搜索或外部数据库索引产品,例如Lucene,可能是更好的选择。

3
这就是LIKE的工作方式 - 它返回完全包含搜索字符串的行,如果使用“%”,还可以选择包含其他内容。
如果您想查看字段是否包含在字符串中,可以这样做:
SELECT * FROM `Table` WHERE  "Testing 123" LIKE CONCAT("%",`name`,"%") 

不要使用CONCAT函数 - 它会像在LIKE左侧使用通配符一样,确保无法使用索引。 - OMG Ponies
阅读了Byers先生的回答后,我认为我误解了这个问题。我的查询将找到所有完全包含在搜索词中的名称。如果您的目标是查找部分匹配搜索词的一部分或另一部分的名称,则不应这样做。 - Scott Saunders
也许吧...但同样可能是你正确理解了问题。我已经重新阅读了问题,仍然无法确定意思。我认为我们的任何一个答案都可能是正确的解释。我希望Belgin Fish能够澄清事情。 - Mark Byers
@Mark Byers:看起来他已经把你标记为正确答案了。很好地解释了问题并回答了它。 - Scott Saunders

1

虽然不是很高效(就像你的例子一样),但可以按照你想要的方式工作:

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

1

在变量$ser被替换后,查询语句如下:

WHERE name LIKE '%Testing 123%'

您应该按单词分隔构建查询语句:

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


我非常确定这会产生相同的结果。 - Andy
唯一的区别是 PHP 中的字符串连接 - 这并没有回答问题。 - OMG Ponies
这不是由于单词之间的%不同导致的结果吗?而且与使用带有两个like的OR相比,它更精确和高效。 - Neuquino

1
正如Scott所提到的,您不能检查搜索是否包含列值,它是另一种方式。 因此,如果$ser =“testing”且表中有一行name = testing 123,它将返回
对于您想要做的事情,您需要将搜索查询标记化为术语,并使用每个术语执行OR搜索,或者更好地检查mysql全文搜索以获得更好的方法。

0

正如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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接