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

Come posso contare e raggruppare colonne separatamente con MySQL?

So che stai lottando con molte cose allo stesso tempo, ma la risposta migliore risolve il problema che ikegami passato rapidamente sulla strada per farlo in Perl:

Le persone spesso fanno molto più del necessario a livello di applicazione perché non imparano mai a fare le cose giuste nel database (come il tuo altra domanda a cui è meglio rispondere con una query SQL appropriata anziché Perl). Ma, per inciso, molte persone lo fanno perché non sono in grado di cambiare lo schema. L'euristica sociale, come l'applicazione appropriata della birra, a volte spiana quel percorso. Un piccolo lavoro per convincere le persone del database si ripaga in multipli in seguito. E, per inciso, "sviluppatore full stack" spesso omette qualsiasi uso sofisticato dei database.

Non farò leggere a nessuno il Database in Depth di CJ Date , ma è molto utile ottenere lo schema corretto. Con diritto, intendo dire che impone il minimo sforzo e complessità al suo utilizzo. Le cose dovrebbero essere facili e non dovresti riorganizzare queste cose a livello di applicazione.

Vuoi contare il numero di volte in cui ciascuna risposta viene selezionata. Il conteggio è qualcosa che i database fanno molto bene, quindi lascia che lo faccia il database.

Hai delle domande. Le domande hanno risposte diverse. I sondaggi raggruppano insiemi di domande. Le persone rispondono ai sondaggi associando le loro risposte alle domande.

Ecco un semplice schema di progettazione (e un tizio del database alla fine si presenterà e mi dirà che non l'ho fatto bene, ma va bene). Il trucco è che nulla deve avere più colonne inutilizzate. Tutto viene fornito in un piccolo pacchetto ordinato (la "relazione" in "database relazionale") che è facilmente collegato alle altre cose tramite "chiavi esterne" (ad esempio question_id per mappare una risposta alla domanda). Le risposte, ad esempio, avranno più righe per lo stesso question_id .

Se qualcuno vuole entrare con gli strumenti di modellazione fantasiosi e fare l'immagine, provaci. Lo contrassegno come wiki della comunità.

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

Una volta mappato e normalizzato correttamente (leggi su forme normali ), è molto facile ottenere i dati desiderati con SELECTs. L'ideale della normalizzazione è semplicemente non ripetere le informazioni o consentire loro di entrare in uno stato incoerente. In queste forme, molte cose diventano molto più facili da fare.

E, se vuoi esercitarti in queste cose, Esplora dati Stackoverflow è un set di dati di vita reale normalizzato rispetto a quello che ho presentato qui.

Ora devi semplicemente contare il numero di volte answer_id si presenta per una particolare combinazione di sondaggio e domanda. Uso intelligente di GROUP BY fa tutto il lavoro per te. Non è più necessario scorrere le righe guardando decine di colonne inutilizzate cercando di capire come contarle. Non solo, ma puoi fare queste cose visualizzazioni , il che significa che scrivi la query una volta e il database finge che i suoi risultati siano una tabella. Puoi quindi semplicemente interrogare la vista (quindi tutti i JOIN s e allo stesso modo sono nascosti), il che è molto semplice. Anche le stored procedure vengono spesso trascurate.