sql >> Databáze >  >> RDS >> Mysql

MySQL vyhledávací dotaz pro název oddělený čárkami

Ano, pokud existuje možnost, můžete dát obojí last, first a first last do databáze, lepší způsob je správně navrhnout schéma.

Pokud někdy zjistíte, že se pokoušíte vyhledávat části nebo s nimi jinak manipulovat sloupců, vaše schéma je téměř jistě nefunkční. Téměř jistě to zabije výkon.

Správný způsob je mít tabulku takto:

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

Potom můžete efektivněji rozdělit jméno zadané uživatelem (jednou, před spuštěním dotazu), než se snažit rozdělit každé jednotlivé jméno v databázi.

V případě, že databáze vždy platí last, first , ve skutečnosti to nemusí být nutné pro změnu schématu.

Problém, který máte v tomto případě, je jednoduše problém s interpretací toho, co uživatel zadal.

Jednou z možností, i když je to zabiják výkonu, je udělat like pro každé samostatné slovo. Pokud tedy uživatel zadal pax diablo , váš výsledný dotaz může být:

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

Tímto způsobem se o pořadí tolik nestaráte.

Nicméně vzhledem k tomu, že nemám rád pomalé dotazy, pokusím se tomu vyhnout, pokud to není nezbytně nutné (nebo je vaše databáze relativně malá a pravděpodobně taková zůstane).

Existují různé způsoby, jak urychlit tyto druhy dotazů, například:

  • pomocí všech možností fulltextového vyhledávání, které má vaše DBMS.
  • emulace těchto schopností extrahováním a ukládáním slov během spouštěčů vkládání/aktualizace (a jejich odstraňováním během spouštěčů mazání).
  • předchozí případ, ale také zajištění dalších sloupců používaných s hodnotami aktuálního sloupce psanými malými písmeny (kvůli rychlosti).
  • sdělit uživateli, že musí použít last, first formulář pro vyhledávání.
  • snaží se vyhnout %something% hledejte řetězec co nejvíce (s something% , indexy lze stále používat).
  • má dříve zmíněná metoda „rozdělit název do dvou sloupců“.


  1. Žádné namapované entity ORM Doctrine podle aktuální konfigurace

  2. Zkontrolujte, zda na tabulku odkazuje cizí klíč na serveru SQL pomocí OBJECTPROPERTY()

  3. PL/SQL, jak uniknout jednoduchým uvozovkám v řetězci?

  4. MySQL agreguje po měsících s průběžným součtem