sql >> Database >  >> RDS >> Mysql

Mysql, PHP, zoeken naar meerdere woorden

Er zijn twee manieren om dit te doen. De eerste is de nogal voor de hand liggende benadering. Stel dat u alle woorden heeft die in een array met de naam $necessaryWords moeten voorkomen:

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

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

Echter, met behulp van %foo% is nogal traag, omdat er geen indexen kunnen worden gebruikt, dus deze zoekopdracht kan prestatieproblemen veroorzaken met enorme tabellen en/of een groot aantal noodzakelijke woorden.

De andere benadering is een FULLTEXT index op subject en body . Je zou de fulltext MATCH IN BOOLEAN MODE . kunnen gebruiken zoals dit:

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

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

Houd er rekening mee dat uw tabel MyISAM . moet gebruiken om FULLTEXT . te gebruiken indexen. UPDATE:Vanaf MySQL 5.6 , InnoDB ondersteunt FULLTEXT ook indexen. Ik denk dat dit qua prestaties de betere keuze zou kunnen zijn. Verdere documentatie over de volledige tekst in booleaanse modus is te vinden in de handleiding .



  1. Hoe maak en vul je een tabel in een enkele stap als onderdeel van een CSV-importbewerking?

  2. Hex naar afbeelding bedekken in PHP?

  3. Hoe JSON te parseren in postgresql

  4. Converteer maandnummer naar maandnaam in PostgreSQL