2012-04-25 52 views
1

我通过这个教程联机工作:http://goo.gl/qnk6UPHP搜索多个字段问题

数据库表:ajax_search

Firstname | Lastname | Age | Hometown | Job 
------------------------------------------- 
Joe  | Smith | 35 | Boulder | CIA 
Steve  | Apple | 36 | Denver | FBI

(类型是除了年龄都VARCHAR是一个int)。

我的问题。下面的sql select语句是否正确写入查询“Joe 35”?出于某种原因,我只能查询“乔”,它可以工作,但不能合并搜索条件。

$sql = "select * from ajax_search where FirstName like '%$rec%' or LastName like '%$rec%' or Age like '%$rec%' or Hometown like '%$rec%'"; 

回答

1

假设你的查询是“Joe 35”,那么没有。您的查询匹配任何四个字段中包含“Joe 35”(在单个字段中)的行。要查询与名乔和35岁的用户,你需要分割的搜索查询,并做一些事情,如:

WHERE Firstname LIKE "$firstname" AND Age LIKE "$age" 
+0

这很有道理,谢谢。是否有可能做这样的搜索不知道用户将键入什么组合? – user1040259 2012-04-25 13:57:33

+0

你可以,虽然它可以变得相当复杂,这就是我的知识消失的地方!尝试阅读http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html – 2012-04-25 14:01:37

1

您需要拆分从搜索查询刺痛:

$columns = array("Firstname", "Lastname", "Age", "Hometown", "Job"); 
$string = ""; // acquire query string 
$split = explode(" ", $string); 
$search_words = array(); 
foreach ($split as $word) { 
    $search_words[] = $word; 
} 

创建查询以搜索所有字段:

$first = true; 
$sql = "select * from ajax_search where"; 
foreach ($search_words as $word) { 
    foreach ($columns as $col) { 
     $sql .= (($first) ? " " : " OR") . "`$col` LIKE \"%" . $word . "%\""; 
     $first = false; 
    } 
} 

然后运行此查询。

另一个也是更好的解决方案是基于更复杂的基于词(标签)的索引,因为当与更多的词一起使用时,这可以生成病态查询

+0

嘿谢谢!你上面的例子,我可以然后搜索“乔博尔德”等。? – user1040259 2012-04-25 15:00:58

+0

是的,你可以搜索anz字段的组合。例如。乔史密斯,史密斯35,35中情局,乔史密斯中央情报局,只是一个或多个领域的任何组合。 – castor 2012-04-25 16:33:55

+0

hummm ..它不适用于这个例子http://goo.gl/qnk6U – user1040259 2012-04-25 17:47:47