1

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

约翰·默多克
我是约翰·默多克
我的名字是约翰,我的第二个名字是默多克

我有一个搜索表单,然后输入“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>";
}

这将仅返回前两行,因为只有这两个单词彼此相邻的那些行。即使单词被拆分,我怎样才能返回另一行?我知道我可以炸开绳子并检查每一块,但我一直在寻找一种更稳定、更有效的方法来做到这一点。

4

2 回答 2

3

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

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

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

更好的答案是在列上使用 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

于 2013-05-30T03:04:22.703 回答
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 fiddle 的链接:http: //phpfiddle.org/main/code/igv-3qc

于 2013-05-30T03:35:01.873 回答