我有一个select where like查询用于搜索表单,如下所示:
<?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个结果)。
有没有人能帮我把这个搜索做得更精准一点?提前谢谢。
发布于 2010-09-02 03:17:02
因此,您希望使用输入的每个单词进行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。进一步的改进可能涉及定义一些停用词,如“and”,以提供更好的结果。
发布于 2012-12-07 20:38:14
我认为最好的解决方案是使用正则表达式。它是最干净的,也可能是最有效的。所有常用的DB引擎都支持正则表达式。
在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
发布于 2010-09-02 03:14:37
对于这里的简单情况,您可以将"and“替换为"%”(但我猜您正在寻找更全面的答案。(这也是特定于订单的,因为苹果必须先于梨。)
https://stackoverflow.com/questions/3621310
复制相似问题