Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Conteo dentro de Join

Estas en el tema de Conteo dentro de Join en el foro de Mysql en Foros del Web. Hola Amigos como les va, estoy algo atorado con una consulta, creo que me estoy oxidando. Tengo dos tablas una de colaboradores (colaboradores y su ...
  #1 (permalink)  
Antiguo 29/03/2013, 22:17
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Pregunta Conteo dentro de Join

Hola Amigos como les va, estoy algo atorado con una consulta, creo que me estoy oxidando. Tengo dos tablas una de colaboradores (colaboradores y su supervisor) y otra de respuestas, la unión de las tablas esta bien ejecutada pero quiero realizar un conteo sencillo, de acuerdo al idpregunta, cuantas respuestas fueron igual a 1 cuantas a 2, a 3 y así sucesivamente. A continuación dejo mi query y una imagen donde tal vez se explique mejor que lo que necesito.

Código HTML:
SELECT respuesta.idpregunta, respuesta.respuesta, ( colaborador.supervisor
) AS supervisor, (colaborador.colaborador) AS colaborador
FROM `respuesta`
LEFT JOIN colaborador ON colaborador.idcol = respuesta.idcolaborador
WHERE respuesta.idencuesta = '1'
AND colaborador.supervisor = 'ALCALA SALAZAR'
ORDER BY `respuesta`.`idpregunta` ASC
[IMG]

Si se dan cuenta en esta imagen la pregunta con el id 1 tiene 4 respuestas con el numero 1, la pregunta con el id 2 tiene 1 respuesta con el numero 3, 2 con el numero 2 y 1 con el numero 1.

Gracias amigos, Muy agradecido de antemano
  #2 (permalink)  
Antiguo 29/03/2013, 22:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Conteo dentro de Join

En realidad, tu consulta no está completamente bien redactada. El uso del LEFT JOIN puee ser muy traicionero si no se lo analiza bien, y en tu caso puede estar dando resultados incorrectos sin percibirlo, simplemente porque en el álgebra de consultas el orden si altera el producto...
La primera tabla debe ser aquella en la que esté el total de los registros posibles, y en tu caso, si uno de los colaboradores no participó en todas y cada una de las preguntas... no saldrá jamás.
Si la encuesta es a los colaboradores, entonces la tabla primaria de la consulta es "colaborador" y no "respuesta".
Yo la podría mas o menos así:
Código MySQL:
Ver original
  1.     C.supervisor,
  2.     C.colaborador,
  3.     R.idpregunta,
  4.     R.respuesta,
  5.     COUNT(R.respuesta) totalRespuesta
  6.     colaborador C
  7.     LEFT JOIN respuesta R ON C.idcol = R.idcolaborador
  8.     R.idencuesta = '1'
  9.     AND C.supervisor = 'ALCALA SALAZAR'
  10. GROUP BY C.supervisor, C.colaborador, R.idpregunta, R.respuesta
  11. ORDER BY R.`idpregunta` ASC
Hay tips adicionales:
1) Usa alias. Ayudan a mantener el código más legible.
2) No uses AS. Es obsoleto, innecesario y los manuales de buenas prácticas en las empresas de desarrollo lo desaconsejan.
3) No uses paréntesis innecesariamente. Los paréntesis tienen impacto en la lógica que aplica el parser y cuando se ponen sin necesidad generan efectos antiperformánticos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 29/03/2013, 22:38
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Conteo dentro de Join

Muchas Gracias por tus consejos y por tu pronta respuesta gnzsoloyo, ya ejecute la consulta tal como me la colocas pero en el caso de totalRespuesta todas la columna me arroja 1
  #4 (permalink)  
Antiguo 29/03/2013, 23:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Conteo dentro de Join

Porque el agrupamiento también está abarcando al colaborador.
Debes especificar claramente cómo quieres hacer la acumulación: Si lo que quieres son los totales de las preguntas que respondieron todo los colaboradores, entonces no peudes poner la lista de colaboradores, solamente las preguntas:
Código MySQL:
Ver original
  1.     R.idpregunta,
  2.     R.respuesta,
  3.     COUNT(R.respuesta) totalRespuesta
  4.     colaborador C
  5.     LEFT JOIN respuesta R ON C.idcol = R.idcolaborador
  6.     R.idencuesta = '1'
  7.     AND C.supervisor = 'ALCALA SALAZAR'
  8. GROUP BY R.idpregunta, R.respuesta
  9. ORDER BY R.`idpregunta` ASC
Es decir: Si quieres saber el total de selecciones de cada respuesta para cada pregunta, no puedes discriminar por colaborador, porque cada uno sólo pudo elegir una única respuesta en un una única pregunta.... Son conceptos incompatibles.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 30/03/2013, 22:35
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Conteo dentro de Join

GNZSOLOYO Estoy Muy agradecido por tu ayuda, creo me estaba ahogando en un vaso de agua, La consulta tal como me la planteaste me funcionó al dedo. De igual manera lo que debo hacer es un poco mas complejo y lo aderecé un poco, como lo puedes ver abajo, incluso como es tanto lo que debo procesar estoy pensando en meter todo este query en una tabla temporal para poder procesar las estadísticas. Gracias de nuevo hermano. Acá te dejo el query para que lo veas, y me digas que te pareció. Saludos

Código MySQL:
Ver original
  1.         R.idpregunta,
  2.         R.respuesta,
  3.         COUNT(R.respuesta) totalRespuesta,
  4.         P.grupo,
  5.         P.subgrupo,
  6.         G.grupo,
  7.         S.sub
  8.     FROM
  9.         colaborador C
  10.         LEFT JOIN respuesta R ON C.idcol = R.idcolaborador
  11.         LEFT JOIN pregunta P ON P.idpregunta= R.idpregunta
  12.         LEFT JOIN grupo G ON G.idgrupo= P.grupo
  13.         LEFT JOIN subgrupo S ON S.idsub= P.subgrupo
  14.     WHERE
  15.         R.idencuesta = '1'
  16.         AND C.supervisor = 'ALCALA SALAVERRIA, RIGOBERTO'
  17.     GROUP BY R.idpregunta, R.respuesta
  18.     ORDER BY R.`idpregunta` ASC

Última edición por gnzsoloyo; 31/03/2013 a las 05:00 Razón: usar Highlights
  #6 (permalink)  
Antiguo 30/03/2013, 22:36
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Conteo dentro de Join

--------------------

Etiquetas: conteo, join, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:19.