Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Suche nach mehreren Schlüsselwörtern

$rows wird die Daten haben, wo Ihr Schlüsselwort code ist Übereinstimmungen in Ihrer Tabelle können Sie Ihren Code so umschreiben, dass er für beide Schlüsselwörter als

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

Erstellen Sie Ihre Abfrage in einer Schleife (über Ihre bereitgestellten Schlüsselwörter) und weisen Sie eindeutige Platzhalter in der Abfrage zu, um sie für alle Werte abzugleichen

Für Volltextsuche bearbeiten

Mit der Volltextsuche können Sie genau denselben Ausdruck mit dem angegebenen Schlüsselwort abgleichen. Um mit der Volltextsuche zu arbeiten, benötigen Sie einen Index vom Typ FULLTEXT .

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

Und Abfrage wird wie

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

Obiger Code erzeugt eine Abfrage wie

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 Die obige Abfrage hat einen Wert für jede Zeile und ihre übereinstimmende Punktzahl, daher können Sie Ihr Ergebnis in absteigender Weise ordnen, um die Datensätze zuerst anzuzeigen, die die höchste Punktzahl haben.