Mysql поиск, порядок в соответствии с приоритетом - PullRequest
1 голос
/ 20 июля 2011

Я решил, что мне нужно поле поиска на моем сайте, но у меня нет никаких знаний об алгоритмах поиска.Поле поиска работает так, как если бы вы могли ввести любое количество имен (имя пользователя, имя, фамилия) или адреса электронной почты, разделяя каждое из них пробелом.Итак, я придумал следующее, используя класс активных записей 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

Я нашел эту тему Поисковый запрос, 'order by' priority , но так как я не знаю, что именно в моем поиске, на самом деле это не такпомогите мне, но, возможно, я мог бы использовать нечто подобное?

В любом случае, вы, ребята, знаете способ решения приоритетной проблемы?Возможно, я пропустил некоторые основные функции, которые могут помочь?И что будет, когда моя база данных станет большой?;)

Спасибо за помощь!

1 Ответ

5 голосов
/ 20 июля 2011

Вы можете сделать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...