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

a mysql le gusta hacer coincidir la palabra completa o el comienzo de la palabra en la cadena

Como ya se indicó en la pregunta, la consulta

$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
                                . 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'

funciona para registros coincidentes donde SEARCHFIELD contiene una palabra que comienza con (o es igual a) $searchText

En cuanto al rendimiento, he realizado una prueba en mi máquina de desarrollo MBP 2,2 GHz i7 quad core :

Buscar una palabra en 4.000 registros lleva alrededor de 40 milisegundos.

Los registros normalmente están indexados (sin texto completo).

Tengo algunos miles de registros y la consulta no se ejecuta con mucha frecuencia, por lo que para mí es buena.
La solución puede no ser adecuada para otros contextos.

Para construir una declaración preparada con la consulta anterior, utilicé la técnica descrita aquí:

Escapar de los comodines de MySQL

El código resultante es el siguiente:

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 );

/* ... */