2011-07-20 138 views
1

我決定我想在我的網站上搜索一個字段,事情是我對搜索算法沒有任何認識。搜索框的工作方式就像可以輸入任意數量的名稱(用戶名,名字,姓氏)或電子郵件,用空格分隔每個名稱。於是我想出了以下使用笨的活動記錄類(這很簡單):Mysql搜索,按優先級排序

$emails = FALSE; 
    $names = FALSE; 

    foreach($search_array as $value){ 
     if(valid_email($value)){ 
      $emails[] = $value; 
     } else{ 
      $names[] = $value; 
     } 
    } 

    if($emails){ 
     $this->db->where_in('email', $emails); 
     if($names){ 
      $this->db->or_where_in('username', $names); 
      $this->db->or_where_in('firstname', $names); 
      $this->db->or_where_in('lastname', $names); 
     } 
    } else{ 
     if($names){ 
      $this->db->where_in('username', $names); 
      $this->db->or_where_in('firstname', $names); 
      $this->db->or_where_in('lastname', $names); 
     } 
    } 

    $this->db->select('id, username, firstname, lastname'); 
    $query = $this->db->get('users'); 

    if($query->num_rows() > 0){ 
     return $query->result();    
    } 

    return FALSE; 

這段代碼並運行了一堆,語句,然後簡單地發送它都回來了。 也許我可以清理if語句和電子郵件的工作方式,但那不是重點。此代碼工作完全(至少有一個很小的數據庫:P),但我想它做更多:

  • 現在你需要輸入正確的姓名或電郵得到任何好的結果。如果你幾乎是正確的,這將是很好的獲得一些建議,但我可能可以通過自己做一些喜歡弄清楚。

  • 我想排序整個結果數組,這裏是我絆倒的地方。由於兩個電子郵件和用戶名是唯一我想要搜索使用以下優先順序顯示:

    1. 電子郵件
    2. 用戶名
    3. 名字+姓

那麼暫且我並不在意考試ple電子郵件+用戶名+名字+姓氏,因爲我相信這將是壓倒一切的方式:P

我確實發現了這個話題Search query, 'order by' priority,但因爲我不知道在我的搜索是什麼,它並沒有真正幫助我,但也許我可以使用類似的東西?

無論如何,你們知道解決優先問題的方法嗎?我可能錯過了一些可能有幫助的主要功能嗎?當我的數據庫變大時會發生什麼? ;)

感謝您的幫助!

回答

5

你可以這樣做:

ORDER BY email != 'value', 
     username != 'value', 
     firstname != 'value' AND lastname != 'value', 
     firstname != 'value', 
     lastname != 'value' 

如果表達式爲假(這意味着他們是相同的),那麼它等於0,將排序比是真實的表達更高(這意味着他們是不同的),這等於!1和排序0。

後,如果您發現=迷惑,那麼這是同樣的事情:

ORDER BY email = 'value' DESC, 
     username = 'value' DESC, 
     firstname = 'value' AND lastname = 'value' DESC, 
     firstname = 'value' DESC, 
     lastname = 'value' DESC 
+0

我不太實際遵循。 「價值」是什麼意思?它從何而來?我想你的意思是我應該用一些東西代替它,如果是這樣的話,換成什麼?我也沒有真正看到我會如何做名字+姓氏pritority(當名字和姓氏匹配到相同的ID) – Vejto

+0

'值'是用戶輸入的搜索值。我將編輯答案以包含名字+姓氏。 – Ariel

+0

首先,我不確定我是否清楚,可以搜索例如多封電子郵件。它會繼續工作嗎?其次,我還是不太明白(這可能與我有關的第一個問題)。由於「值」是一個字符串(或數組,我應該使用?),同樣的工作將如何?它是否檢查每個項目,如果它等於電子郵件字段? – Vejto