sql >> Database teknologi >  >> RDS >> Mysql

Søg efter flere søgeord

$rows vil have de data, hvor dit søgeord code matcher i din tabel, kan du omskrive din kode til at matche for begge søgeord som

$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>';
';

Byg din forespørgsel i loop (over dine angivne søgeord) og tildel unikke pladsholdere i forespørgslen, så de matcher for alle værdier

Rediger for fuldtekstsøgning

Ved at bruge fuldtekstsøgning kan du matche nøjagtig samme sætning med det angivne søgeord. For at arbejde med fuldtekstsøgning skal du bruge et indeks af typen FULLTEXT .

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

Og forespørgslen vil være som

$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>';
';

Ovenstående kode vil producere en forespørgsel som

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 i ovenstående forespørgsel vil have værdi for hver række og dens matchede score, så du kan bestille dit resultat på faldende måde for at vise posterne først, som har den højeste score.



  1. Kan ikke oprette forbindelse til MYSQL fra Docker Instance

  2. SQL Server Transactional Replication Configuration

  3. Brug af varchar(MAX) vs TEXT på SQL Server

  4. json_encode returnerer de næste rækkeværdier - PHP PDO SQL HighCharts