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

mysql kan lide at matche hele ord eller begyndelsen af ​​ord på streng

Som allerede nævnt i spørgsmålet forespørgslen

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

fungerer til at matche poster, hvor SEARCHFIELD indeholder et ord, der begynder med (eller er lig med) $searchText

Med hensyn til ydeevne har jeg lavet en test på min udviklingsmaskine MBP 2,2 GHz i7 quad core :

At søge efter et ord på 4.000 poster tager omkring 40 millisekunder.

Poster er normalt indekseret (ingen fuldtekst).

Jeg har få tusinde poster, og forespørgslen kører ikke særlig ofte, så for mig er det godt.
Løsningen er muligvis ikke egnet til andre sammenhænge.

For at bygge en forberedt erklæring med ovenstående forespørgsel brugte jeg teknikken beskrevet her:

Escaping MySQL wild cards

Den resulterende kode er som følger:

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. Mysql eksisterer vs IN - korreleret underforespørgsel vs underforespørgsel?

  2. Sådan synkroniseres data mellem to tabeller i forskellige databaser (MYSQL), der kører på forskellige servere

  3. Opdater flere rækker med forskellige værdier i en enkelt forespørgsel - MySQL

  4. Sådan bestiller du efter månedsnavn i SQLite