sql >> Databáze >  >> RDS >> Mysql

Mysql, PHP, hledání více slov

Toho lze dosáhnout dvěma způsoby. První je poměrně zřejmý přístup. Řekněme, že máte všechna slova, která se musí objevit v poli $necessaryWords:

$sql = 'SELECT ... FROM ...'; // and so on
$sql .= ' WHERE 1';

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

Nicméně pomocí %foo% je poměrně pomalý, protože nelze použít žádné indexy, takže tento dotaz může způsobit problémy s výkonem u velkých tabulek a/nebo velkého počtu nezbytných slov.

Jiný přístup by byl FULLTEXT index na subject a body . Můžete použít fulltext MATCH IN BOOLEAN MODE takhle:

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

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

Všimněte si, že tabulka musí používat MyISAM za účelem použití FULLTEXT indexy. AKTUALIZACE:Od verze MySQL 5.6 , InnoDB podporuje FULLTEXT také indexy. Myslím, že by to mohla být lepší volba z hlediska výkonu. Další dokumentaci k fulltextu v booleovském režimu lze nalézt v manuál .



  1. použití funkce rownum s> přihlásit oracle

  2. Parametrizované dotazy pomocí psycopg2 / Python DB-API a PostgreSQL

  3. Alternativa omezení MySQL CHECK

  4. Zakažte kontroly cizích klíčů PostgreSQL pro migrace