sql >> Databasteknik >  >> RDS >> Mysql

Mysql, PHP, söker efter flera ord

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 MyISAM för att använda FULLTEXT index. UPPDATERING:Från och med MySQL 5.6 , 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 .



  1. Hur jämför man två fält/kolumner i ett tillstånd?

  2. Hur man lägger till 'ON DELETE CASCADE' i ALTER TABLE-satsen

  3. Intelligent MySQL GROUP BY för aktivitetsströmmar

  4. Fråga efter MySQL:s INFORMATIONSSCHEMA:Varför? På vilket sätt?