Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql gleicht gerne vollständige Wörter oder Wortanfänge mit Strings ab

Wie bereits in der Frage erwähnt, die Abfrage

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

funktioniert für übereinstimmende Datensätze, bei denen SEARCHFIELD enthält ein Wort, das mit $searchText beginnt (oder gleich ist).

Bezüglich Performance habe ich einen Test auf meiner Entwicklungsmaschine MBP 2,2 GHz i7 quad core gemacht :

Die Suche nach einem Wort in 4.000 Datensätzen dauert etwa 40 Millisekunden.

Datensätze werden normalerweise indiziert (kein Volltext).

Ich habe einige tausend Datensätze und die Abfrage wird nicht sehr oft ausgeführt, daher ist sie für mich gut.
Die Lösung ist möglicherweise nicht für andere Kontexte geeignet.

Um eine vorbereitete Anweisung mit der obigen Abfrage zu erstellen, habe ich die hier beschriebene Technik verwendet:

Escaping von MySQL-Wildcards

Der resultierende Code lautet wie folgt:

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

/* ... */