sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo contar y agrupar columnas por separado con MySQL?

Sé que estás luchando con muchas cosas al mismo tiempo, pero la mejor respuesta resuelve el problema que ikegami pasó rápidamente en camino a hacerlo en Perl:

Las personas a menudo hacen mucho más de lo que necesitan en el nivel de la aplicación porque nunca aprenden a hacer lo correcto en la base de datos (como su otra pregunta que se responde mejor con una consulta SQL adecuada en lugar de Perl). Pero, aparte, muchas personas hacen eso porque no pueden cambiar el esquema. Las heurísticas sociales, como la aplicación adecuada de cerveza, a veces allanan ese camino. Un poco de trabajo para convencer a la gente de la base de datos vale la pena en múltiplos más tarde. Y, aparte, el "desarrollador de pila completa" a menudo omite cualquier uso sofisticado de las bases de datos.

No voy a hacer que nadie lea la Base de datos en profundidad de C.J. Date. , pero hay mucho valor en obtener el esquema correcto. Por derecho, quiero decir que impone la menor cantidad de esfuerzo y complejidad en su uso. Las cosas deberían ser fáciles y no debería tener que reorganizar estas cosas en el nivel de la aplicación.

Desea contar el número de veces que se selecciona cada respuesta. Contar es algo que las bases de datos hacen muy bien, así que deje que la base de datos lo haga.

Tienes algunas preguntas. Las preguntas tienen varias respuestas. Las encuestas agrupan conjuntos de preguntas. Las personas responden a las encuestas asociando sus respuestas con las preguntas.

Aquí hay un diseño de esquema simple (y algún tipo de base de datos eventualmente aparecerá y me dirá que no lo hice bien, pero está bien). El truco es que nada tiene que tener varias columnas que no se utilizan. Todo viene en un paquete pequeño y ordenado (la "relación" en "base de datos relacional") que se conecta fácilmente a las otras cosas a través de "claves externas" (por ejemplo, question_id para asignar una respuesta a la pregunta). Las respuestas, por ejemplo, tendrán varias filas para el mismo question_id .

Si alguien quiere venir con las herramientas de modelado de fantasía y hacer la imagen, hágalo. Estoy marcando esto como wiki de la comunidad.

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 vez trazado y normalizado correctamente (leer en formularios normales ), es muy fácil obtener los datos que desea con SELECT. El ideal de normalizar es simplemente no repetir la información o permitir que entre en un estado inconsistente. De esta forma, muchas cosas se vuelven mucho más fáciles de hacer.

Y, si desea practicar tales cosas, el Stackoverflow Data Explorer es un conjunto de datos de la vida real normalizados a lo que he presentado aquí.

Ahora simplemente cuenta el número de veces answer_id aparece para una combinación particular de encuesta y pregunta. Uso hábil de GROUP BY hace todo el trabajo por ti. Ya no necesita iterar a través de las filas mirando decenas de columnas no utilizadas tratando de descubrir cómo contarlas. No solo eso, sino que puede hacer estas cosas vistas , lo que significa que escribe la consulta una vez y la base de datos finge que sus resultados son una tabla. Luego puede simplemente consultar la vista (para que todos los JOIN s y también están ocultos), que es mucho más simple. Los procedimientos almacenados también se suelen pasar por alto.