PHP MySQL搜索组合列

时间:2012-04-16 21:33:58

标签: php mysql search sql-like

当我发现它没有按照我想要的方式进行搜索时,我刚刚完成了用户系统的搜索功能。

如果我有一个名为'fname'和'lname'的2列的数据库表。

在一行中,'fname'的值为'Ashley','lname'的值为'Staggs'。

我可以搜索'Ashley'或'Staggs',我会正确地得到结果,但是如果我搜索'Ashley Staggs',则不会显示任何结果。

我该如何正确地做到这一点?

我的SELECT查询如下:

SELECT * FROM `users` WHERE fname LIKE '%" . protect($_GET['s']) . "%' OR lname LIKE '%" . protect($_GET['s']) . "%'

我知道这样的事情会发生,但这次我无法理解。

谢谢, 阿什利

6 个答案:

答案 0 :(得分:3)

'Ashley Staggs'既不是fname,也不是lname,所以你的请求不会返回任何内容。您可以尝试连接MySQL字段:

SELECT * FROM `users` WHERE fname LIKE '%" . $_GET['s'] . "%' OR lname LIKE '%" . $_GET['s'] . "%' OR CONCAT(fname, ' ', lname) LIKE '%" . $_GET['s'] . "%'

[编辑] 更好:

SELECT * FROM `users`
WHERE REPLACE(CONCAT(fname, lname, fname), ' ', '')
LIKE '%" . str_replace(' ', '', protect($_GET['s'])) . "%'

答案 1 :(得分:0)

SELECT fname_lname FROM ( SELECT CONCAT(fname, ' ', lname) fname_lname FROM users ) users
WHERE fname_lname LIKE '%" . $_GET['s'] . "%'

答案 2 :(得分:0)

你可以尝试这样的事情 - 它只是用空格分割搜索字符串并搜索每个单词:

$search = explode(' ', $_GET['s']);
$query = 'SELECT * FROM `users` WHERE 0';
foreach ($search as $v)
{
  $v = mysql_real_escape_string($v);
  $query .= " OR (`fname` LIKE '%{$v}%' OR `lname` LIKE '%{$v}%')";
}
// echo $query;

答案 3 :(得分:0)

关于sp00m的答案,我的方法略有不同,但建立在相同的概念上。

$search = preg_replace ( "/\s\s+/" , " " , $_GET['s']);

然后使用此查询:

"SELECT * FROM `users` WHERE CONCAT(fname, ' ', lname) LIKE '%" . $search . "%' OR CONCAT(lname, ' ', fname) LIKE '%" . $search . "%'"

修改

刚才有一个想法可以使用。基本上,您可以在表格中创建另外两个字段 - fname_lnamelname_fname,使用我之前提到的正则表达式来消除不必要的空格,使用explode()来检查字数。如果您有两个单词,那么您可以使用这两个新字段,在查询中只提供两个条件。如果只有一个单词,则查询中仍有两个条件。

答案 4 :(得分:0)

嘿,我想建议一个更强大的搜索,但它需要MyISAM表 代码是

$q="you search string";
$searchArray = explode(" ", $q);
$query="SELECT * FROM cmusers WHERE  MATCH (`firstname`, `lastname`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";
$result=mysql_query($query) or die("Error founded:".mysql_error()."there is problem existing we feels a very great sorry");
$finded=mysql_num_rows($result);

可以在http://www.funnenjoy.com

看到这方面的工作

答案 5 :(得分:0)

我会做的

SELECT * FROM users WHERE CONCAT(firstname, ' ', lastname) LIKE '%{$search}%'