Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql aime faire correspondre le mot complet ou le début du mot sur la chaîne

Comme déjà indiqué dans la question la requête

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

fonctionne pour les enregistrements correspondants où le SEARCHFIELD contient un mot qui commence par (ou est égal à) $searchText

Concernant les performances j'ai fait un test sur ma machine de développement MBP 2,2 GHz i7 quad core :

La recherche d'un mot sur 4 000 enregistrements prend environ 40 millisecondes.

Les enregistrements sont normalement indexés (pas de texte intégral).

J'ai quelques milliers d'enregistrements et la requête ne s'exécute pas très souvent, donc pour moi c'est bien.
La solution peut ne pas convenir à d'autres contextes.

Pour construire une instruction préparée avec la requête ci-dessus, j'ai utilisé la technique décrite ici :

Échapper aux jokers MySQL

Le code résultant est le suivant :

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

/* ... */