База данных - лучший способ, как искать имена - PullRequest
4 голосов
/ 26 июля 2011

В эти дни я решаю следующую ситуацию: в моей таблице БД у меня есть столбцы для имени и фамилии.

На моей странице есть данные для поиска людей, и я сталкиваюсь с проблемой, какискать имя в базе данных, которая хранится в двух столбцах, и у меня есть имя в виде строки ("Joe Green").

Например, в базе данных у меня есть следующие данные:

Joe New
Joe Blue
Joe Green
Joe Francois Green

Что можетбыть лучшим способом, как эту проблему решить?В настоящее время я работаю с базой данных MySQL и Rails 3.

РЕДАКТИРОВАТЬ: Спасибо, ребята, за ваши ответы, , но я не знаю, как сделать запрос в нотации Rails 3, возможно лииспользовать "concat"?

Ответы [ 5 ]

6 голосов
/ 26 июля 2011

, если ваш движок таблиц базы данных - myISAM , тогда используйте поиск FULLTEXT

сначала создать FULLTEXT index by

CREATE FULLTEXT INDEX fx_name ON pages (name, surname)

затем используйте запрос ниже, чтобы получить необходимые данные

SELECT  *
FROM    table
WHERE   MATCH(name,surname) AGAINST ('keyword' IN BOOLEAN MODE)

обновление

альтернатива: используйте CONCAT

сначала создать индекс

CREATE INDEX users_firstandlast ON users(name, surname);

option1: повторите CONCAT в вашем предложении WHERE (поскольку AS не создает имя, которое вы можете использовать в предложении WHERE):

SELECT CONCAT(name, ' ', surname) as fullname 
FROM users 
WHERE CONCAT(name, ' ', surname) LIKE '%joe green%';

вариант 2:

SELECT CONCAT(name, ' ', surname) as fullname 
FROM users 
WHERE name LIKE '%joegreen%' or surname LIKE '%joegreen%';

Дополнительная информация

1 голос
/ 26 июля 2011

Многое было бы значительно проще, если бы вы дали некоторое представление о том, какой язык используется в интерфейсе между входом и базой данных (поскольку Rails обычно ассоциируется с Ruby, я предполагаю, что вы это имеете в виду), однако ....

SELECT *
FROM yourtable
WHERE CONCAT(name, ' ', surname) 
      LIKE CONCAT('%',REPLACE(?,' ', '%'),'%')
ORDER BY LEVENSTEIN(CONCAT(name, ' ', surname), ?)

(где '?' Заменяется строкой поиска, а функция levenstein описана здесь )

Производительность будет плохой - лучшим решением будет разбить строку Ruby и попытаться найти совпадения различных комбинаций.

1 голос
/ 26 июля 2011

Вы можете использовать полнотекстовый поиск на сервере sql, который я не рекомендую из-за очень плохой производительности, или использовать более мощный lucin .net и некоторые ссылки:http://msdn.microsoft.com/en-us/library/ms142571.aspx

пометить ответ, если это поможет:)

1 голос
/ 26 июля 2011

сначала используйте функцию split для разделения строки

namearr = name.split

namestr = ""
namearr.each do |i|
  namestr = namestr + i
end

затем используйте значения в вашем запросе

stmt = "выберите * из mytable где CONCAT (имя, имя) =" + namestr

1 голос
/ 26 июля 2011

Один из способов:
* разделить ввод пользователя на слова
* поиск по каждому слову в столбцах имени и фамилии

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