Для этого используйте конструкцию MATCH AGAINST. В мануалах там много про это есть.
Самые главные преимущества перед LIKE:
- поиск происходит не просто по тексту как с лайком, а по индексированным данным, что намного быстрее!
- опять таки поскольку данные индексированы, поиск умеет определять коэффициент релевантности(!), не плохо как для голого мускула, правда?)) И результат соответственно можно отсортировать по релевантности, что очень удобно по сравнению с лайком...
Нюансы кратко:
- для полей по которым будет осуществляться поиск должны быть определены полнотекстовые индексы
- такой поиск не может искать вхождения в середине слова (не фразы, а именно слова!!!). Да в принципе это очень редко встречается на практике.
Но зато поиск будет работать гораздо быстрее чем с LIKE!
Чтобы искать например фразу "дохлые мыши не едят зерно" по словам, надо сделать такое:
- фразу загоняем в массив по пробелу: $request = explode(" ", $req_array);
- из массива удаляем заранее определенные части речи типа союзов, местоимений и т.д.
хотя и не обязательно т.к. MATCH AGAINST игнорит слова 3 и менее символов, но подсознание подлое)), а и еще ж знаки препинания убрать, мало ли...
И потом это все дело опять в строку $to_query = implode(" ", $request);
И в запрос:
select * from `table` WHERE MATCH (`myfield1`, `myfield2`) AGAINST ('$to_query' IN BOOLEAN MODE)
И еще можно сортировку по релевантности состряпать изменив немного запрос:
select *, MATCH (`myfield1`, `myfield2`) AGAINST ('$to_query' IN BOOLEAN MODE) as `score` from `table` WHERE MATCH (`myfield1`, `myfield2`) AGAINST ('$to_query' IN BOOLEAN MODE) order by `score` desc
В итоге мы сможем найти фразу наподобие: "зерновые культуры и мыши - друзья, но если мыши дохлые" по трем словам.
Заметьте, что ставить "%srch_str%" или "*srch_str*" не нужно!!! СУБД понимает все.
Вот как бы такой он поиск. Но еще я прикручивал phpmorphy для того чтобы вытягивать словоформы для каждого слова, тогда можно будет найти фразу типа: "зерна постоянно смеются над дохлыми мышами"
Вроде бы все:)
А, нет, не все. Еще можно помимо LIKE использовать RLIKE.
Для этого наш последний массив слов пихаем в строку, но только вот так:
$to_query = implode("|", $request);
И в запрос: select * from `table` WHERE `myfield1` RLIKE '$request' or `myfield2` RLIKE '$request'
Как бы те же яйца, что и с LIKE но немного удобнее формировать сам запрос.