sql >> Database >  >> RDS >> Mysql

Hoe kan ik kolommen afzonderlijk tellen en groeperen met MySQL?

Ik weet dat je met veel dingen tegelijk worstelt, maar het beste antwoord lost het probleem op dat ikegami snel voorbij op weg om het in Perl te doen:

Mensen doen vaak veel meer dan nodig is op applicatieniveau, omdat ze nooit leren om de juiste dingen in de database te doen (zoals je andere vraag die beter beantwoord kan worden door een geschikte SQL-query in plaats van Perl). Maar terzijde:veel mensen doen dat omdat ze het schema niet kunnen veranderen. Sociale heuristieken, zoals de juiste toepassing van bier, effenen dat pad soms. Een beetje werk om de databasemensen te overtuigen, betaalt zich later in veelvouden uit. En, even terzijde, "full-stack developer" laat vaak elk geavanceerd gebruik van databases achterwege.

Ik ga niemand C.J. Date's Database in Depth laten lezen , maar het heeft veel waarde om het schema goed te krijgen. Met recht bedoel ik dat het de minste moeite en complexiteit kost om het te gebruiken. Dingen zouden gemakkelijk moeten zijn, en je zou deze dingen niet op applicatieniveau moeten herschikken.

U wilt het aantal keren tellen dat elk antwoord is geselecteerd. Tellen is iets dat databases heel goed kunnen, dus laat de database het doen.

U heeft enkele vragen. Vragen hebben verschillende antwoorden. Enquêtes groeperen reeksen vragen. Mensen reageren op enquêtes door hun antwoorden aan de vragen te koppelen.

Hier is een eenvoudig schemaontwerp (en uiteindelijk zal een database-man verschijnen en me vertellen dat ik het niet goed heb gedaan, maar dat is prima). De truc is dat niets meerdere kolommen hoeft te hebben die ongebruikt zijn. Alles wordt geleverd in een net klein pakketje (de "relatie" in "relationele database") die gemakkelijk met de andere dingen kan worden verbonden via "buitenlandse sleutels" (bijv. vraag_id om een ​​antwoord op de vraag in kaart te brengen). Antwoorden hebben bijvoorbeeld meerdere rijen voor dezelfde question_id .

Als iemand binnen wil komen met de mooie modelleertools en de foto wil maken, ga ervoor. Ik markeer dit als 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

Eenmaal in kaart gebracht en correct genormaliseerd (lees op normale formulieren ), is het heel eenvoudig om de gewenste gegevens te krijgen met SELECT's. Het ideaal van normaliseren is simpelweg om informatie niet te herhalen of in een inconsistente toestand te laten komen. In deze vormen worden veel dingen veel gemakkelijker om te doen.

En als je zulke dingen wilt oefenen, is de Stackoverflow Data Explorer is een real-life dataset genormaliseerd naar wat ik hier heb gepresenteerd.

Nu tel je gewoon het aantal keren answer_id verschijnt voor een bepaalde combinatie van enquête en vraag. Slim gebruik van GROUP BY doet al het werk voor je. U hoeft niet langer door rijen te lopen en tientallen ongebruikte kolommen te bekijken om erachter te komen hoe u ze kunt tellen. Niet alleen dat, maar u kunt deze dingen ook views maken , wat betekent dat u de query één keer schrijft en de database doet alsof de resultaten een tabel zijn. U kunt dan eenvoudig de weergave opvragen (dus alle JOIN s en zijn eveneens verborgen), wat veel eenvoudiger is. Opgeslagen procedures worden ook vaak over het hoofd gezien.



  1. Datums vergelijken in MySQL waarbij het tijdgedeelte van een DateTime-veld wordt genegeerd

  2. Oracle:Bereken tijdsverschil in UU:MM:SS tussen 2 datums

  3. Hoe achterlopende nullen van een decimaal te verwijderen in PostgreSQL

  4. Back-up terugzetten van SQL Server-database op lagere versie