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.