2010-05-24 5 views
2

У меня есть таблица и фамилииПоиск 2 поля в то же время

firstname lastname 
--------- --------- 
Joe   Robertson 
Sally  Robert 
Jim   Green 
Sandra  Jordan 

Я пытаюсь найти эту таблицу на основе ввода, который состоит из полного имени. Например:

input: Joe Robert 

Я думал об использовании

SELECT * FROM tablename WHERE firstname LIKE 

но таблица хранит первый и фамилия отдельно, так что я не знаю, как сделать поиск в этом случае

ответ

4

В MyISAM:

SELECT * 
FROM mytable 
WHERE MATCH(firstname, lastname) AGAINST ("Joe* Robert*" IN BOOLEAN MODE); 

Это будет работать намного быстрее, если вы создаете FULLTEXT индекс:

CREATE FULLTEXT INDEX ON mytable (firstname, lastname) 

Для запроса, чтобы иметь возможность искать короткие имена (например, Joe в вашем случае), вам нужно установить переменную @@ft_min_word_len в 1 перед созданием индекса.

В InnoDB вам нужно разбить строку поиска:

SELECT * 
FROM mytable 
WHERE firstname LIKE 'Joe%' 
     AND lastname LIKE 'Robert%' 
+1

работает запрос в булевой режиме без полнотекстового поиска является медленным, поэтому я не рекомендовал бы этого. и изменение переменных сервера, таких как '@@ ft_min_word_len', не является идеальным cz в большинстве случаев, когда вы не можете редактировать файл конфигурации mysql. Простейшим будет запрос, о котором вы упоминали, используя как и подстановочный знак –

2

Альтернативой методу Quassnoi в:

SELECT * 
FROM mytable 
WHERE CONCAT(firstname, " ", lastname) = "Joe Robert" 
+1

Это будет очень медленно, но он должен работать. Вы можете использовать одинарные кавычки в запросе. –

+1

Для точной семантики соответствия он не медленнее, чем полный текст запроса без индекса. Но похоже, что @op хочет частичных совпадений, и этот запрос не будет совпадать с именами, такими как 'Joel Robertson' – Quassnoi

Смежные вопросы