Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql gosta de combinar a palavra completa ou o início da palavra na string


Como já foi dito na pergunta a consulta
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
                                . 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'

funciona para registros correspondentes onde o SEARCHFIELD contém uma palavra que começa com (ou é igual a) $searchText

Em relação ao desempenho fiz um teste na minha máquina de desenvolvimento MBP 2,2 GHz i7 quad core :

A busca de uma palavra em 4.000 registros leva cerca de 40 milissegundos.

Os registros são normalmente indexados (sem texto completo).

Eu tenho alguns milhares de registros e a consulta não é executada com muita frequência, então para mim é bom.
A solução pode não ser adequada para outros contextos.

Para construir uma declaração preparada com a consulta acima, usei a técnica descrita aqui:

Escape de curingas do MySQL

O código resultante é o seguinte:
function like($s, $e)
{
    return str_replace(array($e, '_', '%'), array($e . $e, $e . '_', $e . '%'), $s);
}

/* ... */

/* create a prepared statement */
$stmt = $mysqli->prepare(
    'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE ? ESCAPE "=" OR SEARCHFIELD LIKE ? ESCAPE "="'
); 

if( $stmt )
{
    /* escape the text */
    $escSearchText = like( $searchText, "=" );

    /* 'like' parameters */
    $like1 = $escSearchText . "%";
    $like2 = "%" . $escSearchText . "%";

    /* bind parameters for markers */
    $stmt->bind_param( "ss", $like1, $like2 );

/* ... */