我有一个带有输入框的表单,用户可以在其中指定其名称,名称可以是两个或更多单词,例如John Smith
或John Michael Smith
。
我需要编写一个查询,该查询将返回包含提交名称中所有单词的记录。因此查询将返回具有所有这些名称单词但可以具有不同顺序的记录。
例如,如果搜索字符串为John Michael Smith
,则查询应该能够返回名称为John Smith Michael
,Michael Smith John
,Smith John Michael
或其他所有组合的记录那里的话。可以看出,只返回在名称字段中仍然包含所有单词但可以具有不同顺序的记录。但是,它不应该返回不包含名称部分的结果,例如John Michael
不应该返回,因为它缺少Smith
。
我无法弄清楚如何为这样的要求编写查询。请帮忙。
到目前为止提供的答案甚至还会返回与John Michael
匹配的记录。我尝试了@Marco,@abesto和@Eddie的答案。
问题仍然存在:(
答案 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中生成。
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%";