MySQL:查询搜索所有可能的单词

时间:2011-10-13 09:59:09

标签: php mysql sql

我有一个带有输入框的表单,用户可以在其中指定其名称,名称可以是两个或更多单词,例如John SmithJohn Michael Smith

我需要编写一个查询,该查询将返回包含提交名称中所有单词的记录。因此查询将返回具有所有这些名称单词但可以具有不同顺序的记录。

例如,如果搜索字符串为John Michael Smith,则查询应该能够返回名称为John Smith MichaelMichael Smith JohnSmith John Michael或其他所有组合的记录那里的话。可以看出,只返回在名称字段中仍然包含所有单词但可以具有不同顺序的记录。但是,它不应该返回不包含名称部分的结果,例如John Michael不应该返回,因为它缺少Smith

我无法弄清楚如何为这样的要求编写查询。请帮忙。


更新

到目前为止提供的答案甚至还会返回与John Michael匹配的记录。我尝试了@Marco@abesto@Eddie的答案。

问题仍然存在:(

4 个答案:

答案 0 :(得分:2)

你可以使用这样的查询:

SELECT * FROM your_table
WHERE 
    name LIKE '%John%' AND 
    name LIKE '%Michael%' AND 
    name LIKE '%Smith%'      

显然,必须使用用户输入以{din}方式构建WHERE部分 有些东西可能是错的,但你必须决定它:如果列包含类似“Michael Smith Johnas”的内容,则会返回此记录。

答案 1 :(得分:2)

您可以尝试全文搜索:

SELECT * FROM table WHERE MATCH (name)
AGAINST ('+part1 +part2 +part3' IN BOOLEAN MODE);

在此解决方案中,'+ part1 + part2 + part3'将在PHP中生成。

请参阅the MySQL docs

mysql> select * from sof;
+--------------------+
| n                  |
+--------------------+
| John               |
| Smith              |
| Smith John         |
| Smith John Michael |
| John               |
+--------------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM sof WHERE MATCH(n) AGAINST('+John +Smith +Michael' IN BOOLEAN MODE);
+--------------------+
| n                  |
+--------------------+
| Smith John Michael |
+--------------------+
1 row in set (0.00 sec)

答案 2 :(得分:2)

这很容易。

$keyword=$_POST['keyword'];
$keywords=explode(' ',$keyword);
for($i=0;$i<count($keywords);$i++)
$where .= ($i ? ' and ' : ' where ')."`name` like '%{$keywords[$i]}% '";
$q="select * from $table ".$where;
$rs=mysql_query($q);

答案 3 :(得分:0)

$name=$_POST['name'];  //save the search query in a variable
$query = "SELECT * FROM names WHERE name like %$name%";