Vej*_*jto 1 mysql sql search codeigniter
我决定在我的网站上想要一个搜索字段,事情是我对搜索算法没有任何了解.搜索框的工作方式类似于您可以输入任意数量的名称(用户名,名字,姓氏)或用空格分隔的电子邮件.所以我想出了以下使用codeigniter的活动记录类(它非常简单):
$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;
Run Code Online (Sandbox Code Playgroud)
这段代码的作用是运行一堆where语句,然后简单地将它们全部发回.也许我可以清理if语句以及电子邮件的工作方式,但这不是重点.这段代码完美无缺(至少对于一个非常小的数据库:P),但我希望它能做得更多:
现在您需要输入正确的名称或电子邮件才能获得任何好结果.如果你几乎是正确的,那么获得一些建议会很好,但我可能会自己想出来做一些喜欢.
我想对整个结果数组进行排序,这就是我磕磕绊绊的地方.由于电子邮件和用户名都是唯一的,我希望使用以下优先级进行搜索:
好吧暂时我并不关心例如电子邮件+用户名+名字+姓氏,因为我认为这将是压倒性的方式:P
我确实找到了这个主题搜索查询,'按优先顺序',但由于我不知道在我的搜索中它是什么,它并没有真正帮助我,但也许我可以使用类似的东西?
无论如何,你们知道解决优先级问题的方法吗?我是否可能错过了一些可能有用的主要功能?当我的数据库变大时会发生什么?;)
谢谢大家的帮助!
你可以做:
ORDER BY email != 'value',
username != 'value',
firstname != 'value' AND lastname != 'value',
firstname != 'value',
lastname != 'value'
Run Code Online (Sandbox Code Playgroud)
如果表达式为假(意思是它们是相同的),那么它等于0,并且将排序比为真其中0后等于1,且各种各样的表达(这意味着它们是不同的)更高.
如果你发现!=令人困惑,那么这是同样的事情:
ORDER BY email = 'value' DESC,
username = 'value' DESC,
firstname = 'value' AND lastname = 'value' DESC,
firstname = 'value' DESC,
lastname = 'value' DESC
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1289 次 |
| 最近记录: |