Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL, PHP, Suche nach mehreren Wörtern

Dazu gibt es zwei Möglichkeiten. Der erste ist der ziemlich offensichtliche Ansatz. Angenommen, Sie haben alle Wörter, die in einem Array namens $necessaryWords:

erscheinen müssen
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';

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

Verwenden Sie jedoch %foo% ist ziemlich langsam, da keine Indizes verwendet werden können, daher kann diese Abfrage bei großen Tabellen und/oder einer hohen Anzahl notwendiger Wörter zu Leistungsproblemen führen.

Der andere Ansatz wäre ein FULLTEXT Index auf subject und body . Sie könnten den Volltext MATCH IN BOOLEAN MODE verwenden so:

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

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

Beachten Sie, dass Ihre Tabelle MyISAM verwenden muss um FULLTEXT zu verwenden Indizes. UPDATE:Ab MySQL 5.6 , InnoDB unterstützt FULLTEXT auch Indizes. Ich denke, dies könnte die bessere Wahl in Bezug auf die Leistung sein. Weitere Dokumentation zum Volltext im booleschen Modus finden Sie im Handbuch .