Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso contar e agrupar colunas separadamente com o MySQL?


Eu sei que você está lutando com muitas coisas ao mesmo tempo, mas a melhor resposta resolve o problema que ikegami passou rapidamente mais em seu caminho para fazê-lo em Perl:

As pessoas geralmente fazem muito mais do que precisam no nível do aplicativo porque nunca aprendem a fazer as coisas certas no banco de dados (como seu outra pergunta que é melhor respondido por uma consulta SQL apropriada em vez de Perl). Mas, como um aparte, muitas pessoas fazem isso porque não conseguem alterar o esquema. Heurísticas sociais, como a aplicação apropriada de cerveja, às vezes suavizam esse caminho. Um pouco de trabalho para convencer o pessoal do banco de dados vale a pena mais tarde. E, além disso, o "desenvolvedor de pilha completa" geralmente omite qualquer uso sofisticado de bancos de dados.

Não vou obrigar ninguém a ler o Database in Depth de C.J. Date , mas há muito valor em acertar o esquema. Por certo, quero dizer que impõe o mínimo de esforço e complexidade em seu uso. As coisas devem ser fáceis, e você não deve ter que reorganizar essas coisas no nível do aplicativo.

Você quer contar o número de vezes que cada resposta é selecionada. Contar é algo que os bancos de dados fazem muito bem, então deixe o banco de dados fazer isso.

Você tem algumas perguntas. As perguntas têm várias respostas. As pesquisas agrupam conjuntos de perguntas. As pessoas respondem a pesquisas associando suas respostas às perguntas.

Aqui está um design de esquema simples (e algum cara de banco de dados acabará por aparecer e me dizer que não fiz certo, mas tudo bem). O truque é que nada precisa ter várias colunas que não são usadas. Tudo vem em um pequeno pacote arrumado (a "relação" em "banco de dados relacional") que é facilmente conectado a outras coisas por meio de "chaves estrangeiras" (por exemplo, question_id para mapear uma resposta para a pergunta). As respostas, por exemplo, terão várias linhas para o mesmo question_id .

Se alguém quiser entrar com as ferramentas de modelagem sofisticadas e fazer a imagem, vá em frente. Estou marcando isso como wiki da comunidade.
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

Uma vez mapeado e normalizado corretamente (leia em formulários normais ), é muito fácil obter os dados desejados com SELECTs. O ideal de normalizar é simplesmente não repetir informações ou permitir que elas entrem em um estado inconsistente. Nessas formas, muitas coisas se tornam muito mais fáceis de fazer.

E, se você quiser praticar essas coisas, o Stackoverflow Data Explorer é um conjunto de dados da vida real normalizado para o que apresentei aqui.

Agora basta contar o número de vezes que answer_id aparece para uma combinação específica de pesquisa e pergunta. Uso inteligente de GROUP BY faz todo o trabalho para você. Você não precisa mais percorrer as linhas examinando dezenas de colunas não utilizadas tentando descobrir como contá-las. Não apenas isso, mas você pode fazer essas coisas views , o que significa que você escreve a consulta uma vez e o banco de dados finge que seus resultados são uma tabela. Você pode então simplesmente consultar a visão (para que todos os JOIN s e também estão ocultos), o que é muito simples. Os procedimentos armazenados também são frequentemente negligenciados.