sql >> Database >  >> RDS >> Mysql

Meerdere trefwoorden zoeken

$rows heeft de gegevens waar uw zoekwoord code overeenkomsten in uw tabel kunt u uw code herschrijven zodat deze overeenkomt met beide zoekwoorden als

$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$query = 'SELECT * FROM A ';
$i = 0;
$params = array();
foreach ($exploded as $value):
    if ($i == 0) {
        $query .= ' WHERE `text` LIKE :value_'.$i;
    } else {
        $query .= ' OR `text` LIKE :value_'.$i;
    }
    $params[':value_'.$i] = '%'.$value .'%';
    $i++;
endforeach;
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';
';

Bouw uw zoekopdracht in een lus op (over uw opgegeven zoekwoorden) en wijs unieke tijdelijke aanduidingen in de zoekopdracht toe die overeenkomen met alle waarden

Bewerken voor zoeken in volledige tekst

Met behulp van zoeken in volledige tekst kunt u exact dezelfde woordgroep matchen met het opgegeven trefwoord. Om met zoeken op volledige tekst te kunnen werken, hebt u een index van het type FULLTEXT nodig .

ALTER TABLE `A` ADD FULLTEXT INDEX `fulltextindex` (`text`); 

En de vraag zal zijn als

$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$where = '';
$i = 0;
$select = array();
$params = array();

foreach ($exploded as $value):
    $select[]= ' MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE) ';
    if ($i == 0) {
        $where  .= ' WHERE MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
    } else {
        $where  .= ' OR MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
    }
    $params[':value_'.$i] =  $value ;
    $i++;
endforeach;

$query ='SELECT *,'. implode( ' + ',$select).' AS score FROM A '.$where.' ORDER BY score DESC';
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';
';

Bovenstaande code levert een zoekopdracht op zoals

SELECT *,
MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
+ 
MATCH(`text`) AGAINST('code' IN BOOLEAN MODE) AS score
FROM A 
WHERE MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
OR  MATCH(`text`) AGAINST('code' IN BOOLEAN MODE)
ORDER BY score DESC

Alias ​​score in bovenstaande zoekopdracht heeft een waarde voor elke rij en de bijbehorende score, dus u kunt uw resultaat in aflopende volgorde ordenen om eerst de records weer te geven met de hoogste score.



  1. Records uitsluiten waar subquery resultaten retourneert die elkaar moeten uitsluiten

  2. Hoe een IF-statement in SQL uit te voeren?

  3. DataTable.Load toont minder rijen dan bron DataReader

  4. door komma's gescheiden argument voor IN-operator, MySQL