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 UPDATE:Ab MySQL 5.6
, MyISAM
verwenden muss um FULLTEXT
zu verwenden Indizes.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
.