【问题标题】:Mysql search, order according to prioritymysql搜索,按优先级排序
【发布时间】:2011-10-09 06:35:16
【问题描述】:

我决定在我的网站上添加一个搜索字段,但我对搜索算法一无所知。搜索框的工作方式就像您可以输入任意数量的姓名(用户名、名字、姓氏)或电子邮件,每个人用空格分隔。所以我想出了以下使用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,但由于我不知道我的搜索内容是什么,它并没有真正帮助我,但也许我可以使用类似的东西?

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

感谢大家的帮助!

【问题讨论】:

    标签: mysql sql codeigniter search


    【解决方案1】:

    你可以这样做:

    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
    

    【讨论】:

    • 我实际上并没有完全关注。 “价值”是什么意思?它从何而来?我想你的意思是我应该用什么来代替它,如果是这样的话,用什么来代替?我也真的不明白我会如何做名字+姓氏优先级(当名字和姓氏匹配相同的 id 时)
    • 'value'是用户输入的搜索值。我将编辑答案以包括名字 + 姓氏。
    • 首先我不确定我是否清楚,您可以搜索例如多封电子邮件。它还会起作用吗?其次,我还是不太明白(这可能与第一个问题有关)。由于'value'是一个字符串(或数组,我应该使用哪个?)equal如何工作?它是否检查每个项目是否等于电子邮件字段?
    • 好吧,我想我知道第一个问题的答案了,它还能正常工作吗?
    • 如果它是一个数组,您的 codeigniter 会将其转换为 SQL:email IN ('value1','value2',etc),那么您在 ORDER BY 中执行相同操作。如果您自己编写 SQL,您可能会更轻松,因为您只需将每个 WHERE 子句复制到 ORDER BY。 (我个人不喜欢也从不使用活动记录,原因很简单,我总是遇到他们无法做到的事情。尽管我知道它们使代码变得简单快捷写。)
    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多