sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag räkna och gruppera kolumner separat med MySQL?

Jag vet att du kämpar med många saker samtidigt, men det bästa svaret löser problemet som ikegami gick snabbt över på väg att göra det i Perl:

Människor gör ofta mycket mer än de behöver på applikationsnivå eftersom de aldrig lär sig att göra rätt saker i databasen (som din annan fråga som besvaras bättre av en lämplig SQL-fråga istället för Perl). Men för övrigt gör många det för att de inte kan ändra schemat. Social heuristik, såsom lämplig användning av öl, jämnar ibland ut den vägen. Lite arbete med att övertyga databasens människor lönar sig i multiplar senare. Och som en annan sida, "full stack-utvecklare" utelämnar ofta all sofistikerad användning av databaser.

Jag tänker inte få någon att läsa C.J. Dates djupgående databas , men det finns ett stort värde i att få schemat rätt. Med rätt menar jag att det lägger minsta möjliga ansträngning och komplexitet på användningen. Saker och ting ska vara lätta och du ska inte behöva ordna om dessa saker på applikationsnivå.

Du vill räkna antalet gånger varje svar väljs. Att räkna är något som databaser gör väldigt bra, så låt databasen göra det.

Du har några frågor. Frågor har olika svar. Enkäter grupperar uppsättningar av frågor. Människor svarar på enkäter genom att associera sina svar med frågorna.

Här är en enkel schemadesign (och någon databaskille kommer så småningom att dyka upp och berätta för mig att jag inte gjorde det rätt, men det är bra). Tricket är att ingenting måste ha flera kolumner som är oanvända. Allt kommer i ett snyggt litet paket ("relationen" i "relationsdatabasen") som enkelt kopplas till de andra sakerna genom "främmande nycklar" (t.ex. question_id för att mappa ett svar på frågan). Svar, till exempel, kommer att ha flera rader för samma question_id .

Om någon vill komma in med de snygga modelleringsverktygen och göra bilden, gör det. Jag markerar detta som community-wiki.

Table: Questions
   id
   text

Table: Answers
   id
   text
   question_id

Table: Surveys
   id 
   title

Table: SurveyQuestionSet
   id
   survey_id
   question_id   

Table: Respondent
   id
   text

Table: Response
   id
   respondent_id
   survey_id
   question_id
   answer_id

När den väl har kartlagts och normaliserats ordentligt (läs på normala formulär ), är det mycket enkelt att få den data du vill ha med SELECTs. Idealet med normalisera är helt enkelt att inte upprepa information eller låta den hamna i ett inkonsekvent tillstånd. I dessa former blir många saker mycket lättare att göra.

Och om du vill öva på sådana saker, Stackoverflow Data Explorer är en datauppsättning från verkligheten normaliserad till det jag har presenterat här.

Nu räknar du helt enkelt antalet gånger answer_id dyker upp för en speciell kombination av undersökning och fråga. Snygg användning av GROUP BY gör allt jobb åt dig. Du behöver inte längre iterera genom rader och titta på tiotals oanvända kolumner för att försöka ta reda på hur man räknar dem. Inte bara det, men du kan göra dessa saker till vyer , vilket innebär att du skriver frågan en gång och databasen låtsas att dess resultat är en tabell. Du kan sedan helt enkelt fråga vyn (så alla JOIN). s och likaså är dolda), vilket är mycket enkelt. Lagrade procedurer förbises också ofta.



  1. Skapa flera MySQL-tabeller med PHP

  2. MySQL Performance:Introduktion till JOINs i SQL

  3. Hur byter jag namn på ett index i MySQL

  4. Kan du inte använda en LIKE-fråga i en JDBC PreparedStatement?