Det finns två sätt att göra detta. Det första är det ganska uppenbara tillvägagångssättet. Låt oss säga att du har alla ord som behöver visas i en array som heter $necessaryWords:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';
foreach ($necessaryWords as $word)
$sql .= ' AND concat(subject,body) LIKE "%' . $word . '%"'; //Quotes around string
Använder dock %foo%
är ganska långsam, eftersom inga index kan användas, så den här frågan kan orsaka prestandaproblem med stora tabeller och/eller ett stort antal nödvändiga ord.
Den andra metoden skulle vara en FULLTEXT
index på subject
och body
. Du kan använda fulltexten MATCH IN BOOLEAN MODE
så här:
$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE MATCH(subject,body) AGAINST("';
foreach ($necessaryWords as $word)
$sql .= ' +' . $word;
$sql .= '")';
Observera att din tabell måste använda UPPDATERING:Från och med MySQL 5.6
, MyISAM
för att använda FULLTEXT
index.InnoDB
stöder FULLTEXT
index också. Jag antar att detta kan vara det bättre valet prestandamässigt. Ytterligare dokumentation om fulltexten i booleskt läge finns i handbok
.