sql >> Databasteknik >  >> RDS >> Mysql

MySQL-sökfråga för kommaseparerat namn

Ja, om det finns en möjlighet kan du sätta båda last, first och first last in i databasen är det bättre sättet att utforma ditt schema på rätt sätt.

Om du någonsin hitta dig själv när du försöker söka på, eller på annat sätt manipulera, delar av kolumner är ditt schema nästan säkert brutet. Det kommer nästan säkert att döda prestandan.

Det korrekta sättet är att ha tabellen så här:

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

Då kan du mer effektivt dela upp det användarinmatade namnet (en gång, innan du kör frågan) istället för att försöka dela upp varje enskilt namn i databasen.

I fallet där databasen innehåller alltid last, first , det kanske inte är nödvändigt för en schemaändring.

Problemet du har i det fallet är helt enkelt att tolka vad användaren skrivit in.

En möjlighet, även om det är en prestationsdödare, är att göra en like för varje separat ord. Så om användaren skrev in pax diablo , din resulterande fråga kan vara:

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

På så sätt bryr du dig inte så mycket om beställningen.

Men med tanke på min motvilja mot långsamma frågor, skulle jag försöka undvika det om det inte är absolut nödvändigt (eller din databas är relativt liten och sannolikt kommer att förbli så).

Det finns alla möjliga sätt att snabba upp den här typen av frågor, till exempel:

  • med de fulltextsökmöjligheter som ditt DBMS har.
  • emulera sådana förmågor genom att extrahera och lagra ord under infogning/uppdateringsutlösare (och ta bort dem under raderingsutlösare).
  • det tidigare fallet, men också att säkerställa extra kolumner som används med små bokstäver i den aktuella kolumnen (för hastighet).
  • berätta för användaren att de måste använda den last, first formulär för sökning.
  • försöker undvika %something% söksträng så mycket som möjligt (med something% , index kan fortfarande användas).
  • min tidigare nämnda metod för "dela upp namnet i två kolumner".


  1. Finns det ett bättre sätt att hämta data från två tabeller samtidigt med Sphinx/MySQL?

  2. Varför får jag ett felmeddelande om att det inte gick att ansluta till servern för postgres i Mac OS Lion?

  3. Skapa en offentlig standardprofil för databaspost i SQL Server (T-SQL)

  4. Hur kan jag infoga och ta bort värde i en databas i derby i JSP? [3]