2012-04-25 81 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