Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL, PHP, ricerca di più parole

Ci sono due modi per farlo. Il primo è l'approccio piuttosto ovvio. Supponiamo che tu abbia tutte le parole che devono apparire in un array chiamato $necessaryWords:

$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';

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

Tuttavia, utilizzando %foo% è piuttosto lento, poiché non è possibile utilizzare indici, quindi questa query potrebbe causare problemi di prestazioni con tabelle enormi e/o un numero elevato di parole necessarie.

L'altro approccio sarebbe un FULLTEXT indice su subject e body . Potresti usare il testo completo MATCH IN BOOLEAN MODE così:

$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';

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

Nota che la tua tabella deve usare MyISAM per utilizzare FULLTEXT indici. AGGIORNAMENTO:A partire da MySQL 5.6 , InnoDB supporta FULLTEXT anche gli indici. Immagino che questa potrebbe essere la scelta migliore in termini di prestazioni. Ulteriore documentazione sul testo completo in modalità booleana è disponibile in manuale .