Как можно избежать разделения поискового запроса для поиска в базе данных MySQL? - PullRequest
2 голосов
/ 12 августа 2010

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

Ответы [ 5 ]

1 голос
/ 12 августа 2010

Еще лучше - если вы используете CakePHP 1.3, просто создайте виртуальное поле 'full_name'. Сделайте запрос по этому полю.

http://book.cakephp.org/view/1609/Creating-virtual-fields
http://book.cakephp.org/view/1610/Using-virtual-fields

class User extends AppModel {
    ...
    var $virtualFields = array(
        'full_name' => 'CONCAT( User.first_name, " ", User.last_name )'
    );
    ...
}

Поскольку Cake рассматривает виртуальные поля как обычные поля для основной модели, вы можете просто сделать поиск следующим образом.

$User->find( 'all', array(
    'conditions' => array(
        'User.full_name' => $search_name
        ...
    ),
    ...
);

Вы могли бы даже добавить немного доброты MySQL LIKE в условиях

$User->find( 'all', array(
    'conditions' => array(
        'User.full_name LIKE' => '%' . $search_name . '%',
        ...
    ),
    ...
);

Этот синтаксис означает, что конечный пользователь может поместить часть первого, часть фамилии или полное имя в поле поиска и по-прежнему получать результаты, не беспокоясь о том, выполняет ли код поиск по первым, последним или обоим.

1 голос
/ 12 августа 2010

Рабочее, но ни быстрое, ни надежное решение не будет:

SELECT foo
FROM   bar
WHERE  CONCAT(firstname, ' ', lastname) = $search_name

(Не уверен насчет синтаксиса MySQL CONCAT atm, вам может потребоваться выполнить конкататацию дважды)

Существует высокая вероятность того, что при этом не будут использоваться какие-либо индексы, что сильно замедлит поиск.

Лучшим решением было бы просто разделить имя:

$names = explode(' ', $search_name);

SELECT foo
FROM   bar
WHERE  firstname = $names[0]
AND    lastname  = $names[1]

Еще лучше:
Укажите два поля ввода и укажите их имя и фамилию, чтобы пользователи правильно вводили результаты поиска.

0 голосов
/ 13 августа 2010

Вы можете установить один полнотекстовый индекс для first_name и last_name. Затем просто включите тест для MATCH (first_name, last_name) AGAINST ($ query). Или, если у вас есть больше, чем просто поле для поиска, добавьте их и в индекс.

Пусть SQL сделает всю работу за вас.

0 голосов
/ 12 августа 2010

Как вы ищите людей в вашей БД?

Если у вас есть SQL-запрос, вы можете сделать это как-то так:

  1. Разделить текст поиска на параметры. так что у вас есть имя и фамилия в 2 отдельных параметрах. ( Stackoverflow: как разбить строку в php )

  2. , затем вы можете использовать различные параметры для создания запроса, который соответствует вашим потребностям:

    select * 
    from People
    where 
       (firstname LIKE param1 AND lastname LIKE param2) OR
       (firstname LIKE param2 AND lastname LIKE param1) OR ...
    
0 голосов
/ 12 августа 2010

Ваш 99% случай, вероятно, будет таким:

  1. Разделить строку на первый пробел
  2. Предположим, что первая часть - это имя, а вторая часть - это фамилия

В зависимости от количества пользователей в вашей системе и «творческого подхода» к их именам, вы можете получить несколько ложных негативов при таком подходе.

Вы также можете рассмотреть возможность предоставления пользователю отдельных полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...