【问题标题】:any-word search using LIKE %使用 LIKE % 进行任意词搜索
【发布时间】:2012-03-13 10:53:48
【问题描述】:

我有一个数据库表,其中有一个字段firstname 和一个字段lastname。我正在尝试使用搜索框实现任意词搜索系统,如果假设我们在数据库中有一个名为John Stanley Smith 的用户(其中​​firstname = John Stanleylastname = Smith),我希望能够返回John Stanley Smith 如果用户键入以下任何内容:

1- 属于John Stanley Smith 的任何字母(j、s、l、e、y、m 等...)
2- 任何属于John Stanley Smith的单词
3-作为John Stanley Smith的一部分的任何单词组合(以任何顺序),这意味着,如果用户输入John StanleyJohn SmithStanley SmithStanley John(你明白了)等。 ..我希望能够找到John Stanley Smith

我知道我可以使用MySQL Fulltext Search 功能做到这一点,但如果我这样做,第一点将不起作用(因为 MySQL 全文搜索功能只匹配整个单词,而不是字符串中的子字符串)。此外,执行搜索所需的最少字数(由min_word_len 常量设置)。所以,我真的很想用 LIKE % 来做到这一点。

谢谢

【问题讨论】:

  • 不可能用简单的查询——你必须做一些丑陋的查询构建来做where like '%j%' or like '%o%' or like '%h%' etc...或一系列instr()调用等等。性能可能非常糟糕,并且有大量误报
  • 我想不出现成的解决方案,但我想使用一些正则表达式(可能还有一些 UNION):dev.mysql.com/doc/refman/5.1/en/regexp.html

标签: php mysql sql search sql-like


【解决方案1】:

我可能有误解,但您是否考虑过这样做:

SELECT * FROM customer WHERE
    CONCAT(firstname, " ", lastname) LIKE '%$pattern%'

如果用户输入了多个单词,用空格分隔,简单地将字符串拆分为单词并将查询修改为

SELECT * FROM customer WHERE
    CONCAT(firstname, " ", lastname) LIKE '%$word1%'
 OR CONCAT(firstname, " ", lastname) LIKE '%$word2%'
 OR CONCAT(firstname, " ", lastname) LIKE '%$word3%'
 ...

【讨论】:

  • 我无法跟踪用户将输入的字数(我的意思是,用户可能输入 2、3 或 15 个字),所以我不知道我要输入多长时间我将不得不做 CONCAT... OR CONCAT... OR CONCAT.. OR CONCAT.... 等
  • 使用循环生成查询。 $words = array("word1", "word2"); foreach($words as $word) $query .= "OR CONCAT(firstname, " ", lastname) LIKE '%".esc($word)."%'";
  • 但是如果例如用户输入 4 个字 John Stanley Smith Thomas 会发生什么?这打破了。基本上我想要的只是返回包含至少一个输入的单词或字符的数据
  • 如果您像我在示例中所做的那样使用 OR,则每个包含至少一个单词的元组都将出现在结果中。所以John Stanley Smith Thomas 将匹配其中任何一个以及更多JohnJohn SmithThomas Stanley、... Naveen 已为您进一步格式化此方法,但使用OR 内爆,而不是AND 或只有包含 all 单词的元组才会匹配。
【解决方案2】:

希望对你有帮助

$whereclauses=array();

$terms = explode(' ', $search_term);
foreach ($terms as $term) {
    $term = mysql_real_escape_string($term);
    $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'";
}
$sql = "select * from table where";
$sql .= implode(' and ', $whereclauses);

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    相关资源
    最近更新 更多