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.