これを行うには2つの方法があります。 1つ目は、かなり明白なアプローチです。 $necessaryWordsという配列に表示する必要のあるすべての単語があるとします。
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
ただし、%foo%
を使用する インデックスを使用できないため、かなり低速です。このクエリにより、巨大なテーブルや必要な単語の数が多い場合にパフォーマンスの問題が発生する可能性があります。
もう1つのアプローチは、FULLTEXT
です。 subject
のインデックス およびbody
。フルテキストのMATCH IN BOOLEAN MODE
を使用できます このように:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
テーブルでは 更新:MySQL5.6以降
、MyISAM
を使用する必要があることに注意してください FULLTEXT
を使用するには インデックス。InnoDB
FULLTEXT
をサポート インデックスも。私はこれがパフォーマンスの面でより良い選択かもしれないと思います。ブールモードでの全文に関する詳細なドキュメントは、にあります。マニュアル
。