Ver Mensaje Individual
  #3 (permalink)  
Antiguo 24/10/2011, 22:13
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta para tres tablas

Partamos de un detalle: LEFT JOIN se usa cuando quieres obtener todos los datos de la primera tabla, tengan o no coincidencias con la segunda. Esto, en tu caso, no parece ser correcto, por cuanto se presupone que todas las escuelas tiene grupos y todas tienen alumnos. En ese contexto, se debería usar INNER JOIN y no LEFT JOIN.
Suponiendo que pueda haber escuelas con cero grupos, el uso de LEFT JOIN podría ser correcto, pero eso lo debes plantear desde el principio.
Ahora bien, para obtener el resultado lo que debes lograr es contar todos los grupos diferentes, y eso no lo estás indicando. Por otro lado, contar la cantidad de alumnos, sin discriminar por grupo, no requiere hacer una consulta combinada, ya que de ese resumen sólo se requieren el ID de la escuela y la cantidad de alumnos.

En otras palabras, debes replantear la lógica de la consulta.

Si esto devuelve los alumnos por escuela:

Código MySQL:
Ver original
  1. SELECT idcct, COUNT(idalumno) cantAlumnos
  2. FROM  alumnos
  3. GROUP BY idcct

Y esto la cantidad de grupos, suponiendo que los nombres o ID de grupos son iguales entre diferentes escuelas:

Código MySQL:
Ver original
  1. SELECT E.idcct, COUNT(DISTINCT G.idgrupo) cantgrupos
  2. FROM enlbhct E LEFT JOIN grupos G ON E.idcct = G.idcct
  3. GROUP BY E.idcct

Entonces esto debería devolverte lo que quieres:
Código MySQL:
Ver original
  1.     E.idcct,
  2.     cantAlumnos,
  3.     COUNT(DISTINCT G.idgrupo) cantgrupos
  4.     enlbhct E
  5.     LEFT JOIN
  6.     (SELECT idcct, COUNT(idalumno) cantAlumnos FROM  alumnos GROUP BY idcct) A
  7.     ON E.idcct = A.idcct
  8.     LEFT JOIN grupos G
  9.     ON E.idcct = G.idcct
  10. GROUP BY E.idcct

Podría escribirlo así:

Código MySQL:
Ver original
  1.     E.idcct,
  2.     COUNT(DISTINCT A.idalumno) cantAlumnos,
  3.     COUNT(DISTINCT G.idgrupo) cantgrupos
  4.     enlbhct E
  5.     LEFT JOIN
  6.     alumnos  A ON E.idcct = A.idcct
  7.     LEFT JOIN
  8.     grupos G  ON E.idcct = G.idcct
  9. GROUP BY E.idcct
Pero no estás aclarando si los ID de alumnos se reinician en cada escuela o son únicos para todas las escuelas, y eso puede afectar el resultado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)