2013-12-13 94 views
1

我想要一個將從搜索字段返回最接近關鍵字的查詢。我搜索了4欄。標題,描述,作者,take_place。 這是當前的代碼,它返回所有列的結果。我想要一個更具體的搜索結果。Mysql「like」獲得最相關的多個搜索字詞結果

$v = explode(' ', strtolower($searchwords)); 
if($c != ''){ $and = 'AND cat_id = '.$c; } 
foreach($v as $val){ 
    $query parts[] = "'%".mysql_real_escape_string($val)."%'"; 
} 
$title = implode(' OR title LIKE ', $query_parts); 
$desc = implode(' OR desc LIKE ', $query_parts); 
$author = implode(' OR author LIKE ', $query_parts); 
$take_place = implode(' OR take_place LIKE ', $query_parts); 

$sql_res=mysql_query("select * from nt_seminars where ((title like {$title}) or 
(description like {$description}) or (author like {$author}) or 
(take_place like {$take_place})) $and ORDER BY date;"); 

此查詢返回每個包含任何單詞的結果,我想檢索最相關的組合搜索關鍵字。它會是這樣的:

如果結果在作者和take_place,只檢索那些。不知何故,用AND代替OR,但它根本不會返回任何結果。這個查詢由ajax觸發。

得到更好的東西,但仍然不是我想要的..

$q = $_POST['searchword']; 
    $arraySearch = explode(" ", $_POST['searchword']); 
    // table fields to search 
    $arrayFields = array(0 => "title", 1 => "city", 2=> "author"); 
    $countSearch = count($arraySearch); 
    $a = 0; 
    $b = 0; 
    $query = "SELECT * FROM ".$table." WHERE ("; 
    $countFields = count($arrayFields); 
    while ($a < $countFields) 
    { 
    while ($b < $countSearch) 
    { 
     $query = $query."$arrayFields[$a] LIKE '%$arraySearch[$b]%'"; 
     $b++; 
     if ($b < $countSearch) 
     { 
     $query = $query." AND "; 
     } 
    } 
    $b = 0; 
    $a++; 
    if ($a < $countFields) 
    { 
     $query = $query.") OR ("; 
    } 
    } 
    $query = $query.")"; 
    $query_result = mysql_query($query); 

    if(mysql_num_rows($query_result) < 1) 
    { 
    echo '<span class="no-borders">No results found</span>'; 
    } 
    else 
    { 
    echo '<ul class="list-group no-radius m-b-none m-t-n-xxs list-group-lg no-border">'; 
    // output list of articles 
    while($row = mysql_fetch_assoc($query_result)) 
    { 
//output loop 
    } 
    } 

這將返回只列一個被找到的關鍵詞。我需要一個消除類型的查詢..

+1

這將有助於:http://stackoverflow.com/questions/12344795/count-the-number-of-occurences-of-a-string-in-a-varchar-field – gvee

+0

我想在多列中搜索。如果發現在「作者」上找到了包含author =「value」的所有行,但是如果找到了author =「michael」和take_place =「Greece」,則顯示所有這些行。找到的點擊越多,查詢就越相關。 – DecoderNT

回答

0

創建它。 爲了用ajax KEYUP功能來搜索多個列,與多個關鍵字,我用

$table = "nt_seminars"; 
// explode search words into an array 
$q = $_POST['searchword']; 
if($_GET[cat_id] != ''){ $and = 'AND cat_id='.$_GET[cat_id]; } 
     $arraySearch = explode(" ", $_POST['searchword']); 
    // table fields to search 
    $arrayFields = array(0 => "title", 1 => "city", 2=> "author"); 
    $countSearch = count($arraySearch); 
    $a = 0; 
    $b = 0; 
    $query = "SELECT *, CONCAT_WS(' ',title,author,city) FROM ".$table." WHERE ("; 
    $countFields = count($arrayFields); 
    while ($a < $countFields) 
    { 
    while ($b < $countSearch) 
    { 
     $query = $query."CONCAT_WS(' ',title,author,city) LIKE '%$arraySearch[$b]%'"; 
     $b++; 
     if ($b < $countSearch) 
     { 
     $query = $query." AND "; 
     } 
    } 
    $b = 0; 
    $a++; 
    if ($a < $countFields) 
    { 
     $query = $query.") OR ("; 
    } 
    } 
    $query = $query." $and AND visible = 1 ORDER BY date desc)"; 
    $query_result = mysql_query($query) or die ($e = mysql_error()); 

    if(mysql_num_rows($query_result) < 1) 
    { 
    echo '<span class="no-borders">No results found</span>'; 
    } 
    else 
    { 
    while($row = mysql_fetch_assoc($query_result)) 
    { 
     // output whatever you want here for each search result 
    } 
    } 

基本上,它是所有關於,結合所有列,它們用空格分隔,以便檢索由字母結果而不是單詞(FULLTEXT)。 我用它進行實時搜索輸出到列表 希望有所幫助!