Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql, PHP, procurando por várias palavras


Existem duas maneiras de fazer isso. A primeira é a abordagem bastante óbvia. Digamos que você tenha todas as palavras que precisam aparecer em um array chamado $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';

foreach ($necessaryWords as $word)
    $sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string

No entanto, usando %foo% é bastante lento, pois nenhum índice pode ser usado, portanto, essa consulta pode causar problemas de desempenho com tabelas enormes e/ou um alto número de palavras necessárias.

A outra abordagem seria um FULLTEXT índice em subject e body . Você pode usar o texto completo MATCH IN BOOLEAN MODE assim:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';

foreach ($necessaryWords as $word)
    $sql .= ' +' . $word;
$sql .= '")';

Observe que sua tabela deve usar MyISAM para usar FULLTEXT índices. ATUALIZAÇÃO:A partir do MySQL 5.6 , InnoDB suporta FULLTEXT índices também. Eu acho que isso poderia ser a melhor escolha em termos de desempenho. Mais documentação sobre o texto completo em modo booleano pode ser encontrada em manual .