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

a mysql piace abbinare la parola completa o l'inizio della parola sulla stringa

Come già affermato nella domanda la query

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

funziona per la corrispondenza dei record in cui il SEARCHFIELD contiene una parola che inizia con (o è uguale a) $searchText

Per quanto riguarda le prestazioni ho fatto un test sulla mia macchina di sviluppo MBP 2,2 GHz i7 quad core :

La ricerca di una parola su 4.000 record richiede circa 40 millisecondi.

I record sono normalmente indicizzati (nessun testo completo).

Ho poche migliaia di record e la query non viene eseguita molto spesso, quindi per me va bene.
La soluzione potrebbe non essere adatta per altri contesti.

Per costruire una dichiarazione preparata con la query precedente ho usato la tecnica descritta qui:

Escaping dai caratteri jolly MySQL

Il codice risultante è il seguente:

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

/* ... */