sql >> Base de Datos >  >> RDS >> Mysql

Búsqueda de varias palabras clave

$rows tendrá los datos donde su palabra clave code coincidencias en su tabla, puede reescribir su código para que coincida con ambas palabras clave como

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

Cree su consulta en bucle (sobre las palabras clave proporcionadas) y asigne marcadores de posición únicos en la consulta para que coincida con todos los valores

Editar para búsqueda de texto completo

Al usar la búsqueda de texto completo, puede hacer coincidir exactamente la misma frase con la palabra clave proporcionada. Para trabajar con la búsqueda de texto completo, necesita un índice de tipo FULLTEXT .

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

Y la consulta será como

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

El código anterior producirá una consulta como

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 en la consulta anterior tendrá un valor para cada fila y su puntaje coincidente, por lo que puede ordenar su resultado de manera descendente para mostrar primero los registros que tienen un puntaje más alto.