2013-08-29 2 views
2

Я использую этот Mysql запрос:поиск по нескольким столбцам

WHERE fname LIKE '%{$query}%' OR lname LIKE '%{$query}%' OR zipcode LIKE '%{$query}%' OR city LIKE '%{$query}%' 

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

  • Имя: Bill
  • Фамилия: Gates
  • Zipcode: 12345 AA
  • Город: Нью-Йорк

Когда я ищу «Нью-Йорк», я получаю ожидаемый результат (счетные ворота). Но когда я ищу «счет нового йорка», я не получаю никаких результатов.

Каков правильный запрос для поиска по нескольким столбцам?

+0

Является ли ваш стол InnoDB? – Mihai

+0

И почему это заставляет задуматься? Вы запросили строку «bill new york», и ни один из столбцов не содержал ее. Вы получили результат для 'new york', потому что один столбец имел * точно * эту строку. Нет правильных способов, есть способ, который дает вам данные и способ, которым это не так. Использование 'LIKE' для поиска плохо, потому что оно не просто медленное - это, как вам было трудно, выполнить правильно. Google об использовании индексов и поисков FULLTEXT (он работает с механизмом хранения InnoDB), чтобы узнать, как люди ищут несколько слов в нескольких столбцах. –

+0

@mihai Да InnoDB это –

ответ

3

При использовании LIKE в вашем заявлении в колонке, которую вы говорите, сравнить все «законопроект Нью-Йорк» против города «Нью-Йорк», который потерпит неудачу, потому что фраза «счет» была в запросе, а не в столбце.

В этом примере вы лучше используете поиск MySQL FULLTEXT, как показано ниже;

SELECT FieldName, 
MATCH (FieldName) AGAINST (+"Bill New York" IN BOOLEAN MODE) AS Relevance 
FROM MyTable 
WHERE MATCH (FieldName) AGAINST (+"Bill New York" IN BOOLEAN MODE) 
HAVING Relevance > 0 
ORDER BY Relevance DESC 

Если вы можете предоставить свои структуры таблиц, я могу расширить ответ.

+0

Стол InnoDB, так что полный поиск отсутствует. – Mihai

+2

Поддержка @Mihai InnoDB для индексов FULLTEXT доступна в MySQL 5.6.4 и выше. http://dev.mysql.com/doc/refman/5.6/en/innodb-storage-engine.html – Tommassiov

+0

5.5.3.1, все еще хорошо знать, что они добавили полный текст. – Mihai

0

проблема у Вас есть, что, как в основном на всякий случай insesative версии =

Есть два пути вы можете пойти о том, что вы пытаетесь сделать, то firsat бы взрываются вы реалы запроса на и использовать для каждой найденной работы сирены LIKE, это грязно, и я бы не посоветовал это.

seccond более предпочтительным вариантом является использование полнотекстового поиска MATCH() AGAINST() это гораздо проще и делает для более чистого кода http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html < - это хорошее место, чтобы начать

0

Вам либо нужно разобрать запрос на отдельные слова, либо динамически построить предложение looooong WHERE, которое ищет каждое поле для каждого слова отдельно, ORING их вместе.

ИЛИ

используется FULLTEXT индексацию.

Я бы предложил последний.