使用LIKE获取多个结果

时间:2013-05-30 03:02:32

标签: php sql

假设我的数据库中有一些记录包含如下数据:

  

John Murdoch
  我是约翰默多克   我的名字是约翰,我的第二个名字是murdoch

我有一个搜索表单,我输入“john murdoch”,它将运行此查询:

$search //contain the search string in this case is john murdoch
$sql = mysqli_query($sql, "SELECT * FROM table WHERE column LIKE '%$search%'");
while($row = mysql_fetch_assoc($sql)){
echo $row['first']."<br>";
}

这将仅返回前两行,因为它只是那些两个单词彼此相邻的行。即使单词被拆分,我怎么能返回另一行?我知道我可以爆炸字符串并检查每一件,但我一直在寻找一种更稳定,更有效的方法。

2 个答案:

答案 0 :(得分:3)

在查询之前,只需使用通配符%替换标点符号和空格。

$search = str_replace ( array( '.', ' ', "'", '-' ), '%', $search );

这仍然需要第一个单词出现在第二个单词之前的文本中。因此,如果您的搜索是“默多克约翰”,您将不会返回任何结果。

更好的答案是在列上使用FULLTEXT搜索(必须在MySQL中执行此操作),并对列执行MATCH()查询,如下所示:

在每个单词前添加一个加号(表示该单词是必需的)

$words = '+' . str_replace( ' ', ' +', $search );

您的查询:

SELECT * FROM table MATCH ( column ) AGAINST ( '$words' IN BOOLEAN MODE)

此处有更多信息:http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

答案 1 :(得分:0)

SELECT * FROM table WHERE `column` LIKE '%john%' AND `column` LIKE '%murdoch%'

我会像这样构建那个查询:

$search_terms = array('john','murdoch');
$field_to_search = 'some_column';

$sql = 'SELECT * FROM table WHERE' . "\n";

$sql .= '`' . $field_to_search . '` LIKE \'%' 
   . implode('%\' AND `' . $field_to_search . '` LIKE \'%',$search_terms)
   . '%\'';

PHP可以与任意数量的搜索词一起使用。它需要所有匹配,因为它与AND连接。

这是一个php小提琴的链接:http://phpfiddle.org/main/code/igv-3qc