2011-07-20 107 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