mysql搜索,按优先级排序

标签 mysql sql codeigniter search

我决定在我的网站上添加一个搜索字段,但我对搜索算法一无所知。搜索框的工作方式就像您可以输入任意数量的姓名(用户名、名字、姓氏)或用空格分隔的电子邮件。所以我想出了以下使用 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;

这段代码所做的是运行一堆 where 语句,然后将它们全部发回。 也许我可以清理 if 语句和电子邮件的工作方式,但这不是重点。这段代码完美地工作(至少对于一个非常小的数据库 :P)但我希望它做更多的事情:

  • 现在您需要输入正确的姓名或电子邮件才能获得好的结果。如果你几乎是对的,那么得到一些建议会很好,但我可能可以通过自己做一些 LIKE 来解决这个问题。

  • 我想对整个结果数组进行排序,这就是我遇到麻烦的地方。由于电子邮件和用户名都是唯一的,我希望使用以下优先级显示搜索:

    1. 电子邮件
    2. 用户名
    3. 名字 + 姓氏
    4. 名字
    5. 姓氏

好吧,目前我并不真正关心例如电子邮件+用户名+名字+姓氏,因为我相信这会让人不知所措:P

我确实找到了这个主题 Search query, 'order by' priority但由于我不知道我的搜索结果是什么,所以它对我没有真正帮助,但也许我可以使用类似的东西?

你们知道解决优先级问题的方法吗?我是否可能错过了一些可能有用的主要功能?当我的数据库变大时会发生什么? ;)

感谢大家的帮助!

最佳答案

你可以这样做:

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

关于mysql搜索,按优先级排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760335/

相关文章:

php - 在 MySQL 中获取每个月的最后一条记录....?

php - 更新mysql记录时获取纯数组文本

MySQL SUM left join 显示所有类别即使总和为0

mysql - SQL INNER JOIN 返回的行比我需要的多

javascript - 使用 AJAX 将输入值传递给 Controller ​​的困难

php - Codeigniter 无法从数据库表中获取所有数据

javascript - 如何在sql中使用时间戳字符串查询日期时间戳字段

mysql - 将数据部分插入表中

MYSQL SELECT 行的总和超过 200

php - 使用左连接,表列的总和返回 null (codeigniter)