2016-03-08 58 views
3

我無法找到任何真正幫助我解決這個問題的東西。 我有以下結構的數據庫:mySql - 基於關鍵字的搜索查詢

enter image description here

和一個簡單的查詢來搜索並顯示從數據庫中的一些結果:

if ($_REQUEST['search']) { 
    $q = $_REQUEST['search']; 
    $q_comma = explode(", ", $q); 
    $where_in_set = ''; 
    $count = count($q_comma); 

    foreach ($q_comma as $q) { 
     $counter++; 
     if ($counter == $count) { 
      $where_in_set .= "FIND_IN_SET('$q','keywords')"; 
     } else { 
      $where_in_set .= "FIND_IN_SET('$q','keywords') AND "; 
     } 
    } 


    $sql_res = "select link, description, keyword from myDB where $where_in_set or description like '%$q%'"; 

此代碼的工作,但不是真的,因爲我想。

在關鍵字列中,我有不同的以逗號分隔的關鍵字,並且即使訂單不同,我也希望能夠搜索它們。

下面是一個例子:比方說,我有到我的關鍵字列

谷歌,Facebook,Twitter的

以我目前的代碼,如果我鍵入谷歌,我可以看到的結果,但如果我鍵入Twitter,我沒有看到它。

有什麼我可以做的,使其工作,而不考慮關鍵字的順序,但也有一個非常快的搜索?

任何幫助將非常感激。

PS。如果可能的話,我只想保留一個數據庫,因爲我閱讀了關於創建一個只有ID和關鍵字的新表,並且在我的搜索中加入了ID上的表,但如果可能的話,我更喜歡更好的解決方案。

感謝

編輯

有些更新:

  1. 由@Frayne Konok指出,我有在lowcase分貝在lowcase查詢和所有的價值,以及,所以案件不能成爲問題
  2. 正如@mkaatman所建議的那樣,我圍繞反引號(')列包裹
  3. 我改變了我的查詢,以便現在它看起來像一個在答覆@ user2272989建議

所以我的查詢現在看起來是這樣的:

select link, description, keyword from myDB 
where (FIND_IN_SET('google',`keyword`) or 
     FIND_IN_SET('facebook', `keyword`) or 
     FIND_IN_SET('twitter', `keyword`)) 
     OR description like 'google, facebook, twitter' 

而且它如果連返回值順序是不同的,但它不是隻顯示我想要的。 例如,如果我編寫推特,谷歌,臉書,我有一個像28行,其中只有2個所有的三個詞作爲關鍵字,而另一個我只有一個或兩個

編輯2 - 更新

我只是想「重新打開」這個問題,因爲我沒有設法解決這個問題。如果我將所有關鍵字都改爲對象,那麼最好將它們用作關鍵字?或者什麼是絕對最好和更可靠的方法來搜索數據庫的關鍵字?擁有不同的DB並使用INNER JOIN?

在這一點上,我願意改變結構和代碼,如果它有幫助。

感謝

+0

這是否工作? 'SELECT FIND_IN_SET('Twitter','Google,Facebook,Twitter'); '我會''var_dump($ q);'在foreach中確保你正在檢查你認爲你在檢查的內容。另外,我不認爲關鍵字應該用引號括起來。 – mkaatman

+0

大小寫可能是問題,您可以在'description'中嘗試'LOWER'。例如:'LOWER(描述)',如'%$ q%''。也''strtolower''$ q' –

+0

@mkaatman沒有關鍵字引號我有一個語法錯誤,說「表中的未知列關鍵字」 – Nick

回答

0

我結束了使用這種結構和查詢位置:

$q = $_REQUEST['search']; 
$q_comma = array_filter(explode(' ', str_replace(',', ' ', $q))); 
$count = count($q_comma); 
$dbQuery = "select id, link, description, tags from db where "; 
$searchTerms = ''; 

foreach ($q_comma as $q) { 
    $counter++; 
    if ($counter == 1) { 
     $searchTerms .= "tags LIKE '%$q%'"; 
    } else { 
     $searchTerms .= "and tags LIKE '%$q%'"; 
    } 
} 


$sql_res = $dbQuery . $searchTerms; 
$result = mysqli_query($db, $sql_res) or die(mysqli_error($db)); 
$return_arr = array(); 
$data = array(); 
if (mysqli_num_rows($result) == 0) { 
    echo "Nothing"; 
} else { 
    while ($row = mysqli_fetch_object($result)) { 
     $data[] = $row; 
    } 
    mysqli_free_result($result); 
    echo json_encode($data); 
} 
0

這可能會幫助你

$sql_res = "select link, description, keyword from myDB 
     where (FIND_IN_SET('yahoo',keyword) or 
      FIND_IN_SET('twitter',keyword)) or 
      description like '%$q%'"; 

您正在使用AND條件FIND_IN_SET

+0

與您的示例並不真正接縫,因爲我需要篩選...如果我鍵入谷歌,臉書,它顯示所有正確的行,但如果我添加例如Twitter,它仍然顯示所有行,即使我只有1與所有的3個關鍵字togheter – Nick