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

Query di ricerca MySQL per il nome separato da virgole

Sì, se c'è la possibilità puoi mettere entrambi last, first e first last nel database, il modo migliore è progettare correttamente lo schema.

Se mai ti ritrovi a cercare o manipolare in altro modo parti di colonne, il tuo schema è quasi sicuramente rotto. Quasi sicuramente ucciderà le prestazioni.

Il modo corretto è avere la tabella così:

T1  FirstName  LastName
==  =========  ========
 1  Pax        Diablo
 2  Bob        Smith
 3  George     Jones

Quindi puoi dividere in modo più efficiente il nome inserito dall'utente (una volta, prima di eseguire la query) piuttosto che provare a dividere ogni singolo nome nel database.

Nel caso in cui il database contiene sempre last, first , potrebbe non essere effettivamente necessario per una modifica dello schema.

Il problema che hai in quel caso è semplicemente quello di interpretare ciò che l'utente ha inserito.

Una possibilità, sebbene sia un killer di prestazioni, è fare un like per ogni singola parola. Quindi, se l'utente ha inserito pax diablo , la tua query risultante potrebbe essere:

select T1 from mytable
    where T2 like '%pax%'
      and T2 like '%diablo%'

In questo modo, non ti importa molto dell'ordine.

Tuttavia, data la mia antipatia per le query lente, cercherei di evitarlo a meno che non sia assolutamente necessario (o il tuo database è relativamente piccolo e probabilmente rimarrà tale).

Esistono molti modi per velocizzare questo tipo di query, ad esempio:

  • utilizzando qualsiasi capacità di ricerca full-text di cui dispone il tuo DBMS.
  • emulazione di tali abilità estraendo e memorizzando parole durante i trigger di inserimento/aggiornamento (e rimuovendoli durante i trigger di eliminazione).
  • quel caso precedente, ma assicurando anche colonne aggiuntive utilizzate con valori minuscoli della colonna corrente (per la velocità).
  • comunicando all'utente che deve utilizzare last, first modulo per la ricerca.
  • cercando di evitare il %something% stringa di ricerca il più possibile (con something% , gli indici possono ancora essere utilizzati).
  • il mio metodo "dividi il nome in due colonne" menzionato in precedenza.