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

Hvordan kan jeg tælle og gruppere kolonner separat med MySQL?

Jeg ved, at du kæmper med mange ting på samme tid, men det bedste svar løser problemet, som ikegami hurtigt bestået over på vej til at gøre det i Perl:

Folk gør ofte meget mere, end de behøver på applikationsniveau, fordi de aldrig lærer at gøre de rigtige ting i databasen (såsom din andet spørgsmål som er bedre besvaret af en passende SQL-forespørgsel i stedet for Perl). Men i øvrigt gør mange mennesker det, fordi de ikke er i stand til at ændre skemaet. Sociale heuristika, såsom passende anvendelse af øl, udjævner nogle gange denne vej. Lidt arbejde med at overbevise databasefolkene betaler sig i multipler senere. Og som en anden sidebemærkning udelader "fuldstackudvikler" ofte enhver sofistikeret brug af databaser.

Jeg vil ikke få nogen til at læse C.J. Dates database i dybden , men der er meget værdi i at få skemaet rigtigt. Med ret mener jeg, at det pålægger den mindst mulige indsats og kompleksitet på dets brug. Tingene skal være nemme, og du skal ikke skulle omarrangere disse ting på applikationsniveau.

Du vil tælle antallet af gange, hvert svar er valgt. At tælle er noget, som databaser gør meget godt, så lad databasen gøre det.

Du har nogle spørgsmål. Spørgsmål har forskellige svar. Undersøgelser grupperer sæt af spørgsmål. Folk svarer på undersøgelser ved at forbinde deres svar med spørgsmålene.

Her er et simpelt skemadesign (og en eller anden databasefyr vil til sidst dukke op og fortælle mig, at jeg ikke gjorde det rigtigt, men det er fint). Tricket er, at intet skal have flere kolonner, der er ubrugte. Alt kommer i en pæn lille pakke ("relationen" i "relationel database"), der nemt forbindes med de andre ting gennem "fremmednøgler" (f.eks. question_id for at kortlægge et svar på spørgsmålet). Svar, for eksempel, vil have flere rækker for det samme question_id .

Hvis nogen vil ind med de smarte modelleringsværktøjer og lave billedet, så gå efter det. Jeg markerer dette 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 er kortlagt og normaliseret korrekt (læs op på normale former ), er det meget nemt at få de data, du ønsker med SELECTs. Idealet for normalisering er simpelthen ikke at gentage information eller lade den komme i en inkonsekvent tilstand. I disse former bliver mange ting meget nemmere at gøre.

Og hvis du vil øve dig på sådanne ting, kan du bruge Stackoverflow Data Explorer er et datasæt fra det virkelige liv normaliseret til det, jeg har præsenteret her.

Nu tæller du blot antallet af gange answer_id dukker op for en bestemt kombination af undersøgelse og spørgsmål. Smart brug af GROUP BY gør alt arbejdet for dig. Du behøver ikke længere at gentage rækkerne og se på snesevis af ubrugte kolonner for at finde ud af, hvordan du tæller dem. Ikke kun det, men du kan lave disse ting visninger , hvilket betyder, at du skriver forespørgslen én gang, og databasen lader som om, dens resultater er en tabel. Du kan derefter blot forespørge på visningen (så alle JOIN). s og ligeledes er skjulte), hvilket er meget enkelt. Lagrede procedurer bliver også ofte overset.



  1. Hvordan kontrollerer du, om IDENTITY_INSERT er sat til TIL eller FRA i SQL Server?

  2. Kombinerer betingelse fra to kolonner mysql

  3. FEJL:kolonne med relation eksisterer ikke PostgreSQL, Kan ikke køre indsæt forespørgsel

  4. Hvordan ændres CHARACTER SET (og COLLATION) i hele en database?