sql >> Databasteknik >  >> RDS >> Mysql

mysql gillar att matcha hela ordet eller början av ord på strängen

Som redan nämnts i frågan frågan

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

fungerar för att matcha poster där SEARCHFIELD innehåller ett ord som börjar med (eller är lika med) $searchText

Angående prestanda har jag gjort ett test på min utvecklingsmaskin MBP 2,2 GHz i7 quad core :

Att söka efter ett ord på 4 000 poster tar cirka 40 millisekunder.

Poster indexeras normalt (ingen fulltext).

Jag har några tusen poster och frågan körs inte så ofta så för mig är det bra.
Lösningen kanske inte passar för andra sammanhang.

För att bygga ett förberett uttalande med ovanstående fråga använde jag tekniken som beskrivs här:

Escaping MySQL wild cards

Den resulterande koden är som följer:

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

/* ... */


  1. eclipse - JPA-enheter från tabeller, inga scheman listade

  2. Anslut SQL Server till HubSpot CRM

  3. Hur använder man en användarvariabel i MySQL LIKE-klausul?

  4. Inverkan av fragmentering på genomförandeplaner