Ver Mensaje Individual
  #5 (permalink)  
Antiguo 25/10/2011, 16:46
chenteb
 
Fecha de Ingreso: octubre-2009
Mensajes: 48
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Consulta para tres tablas

si no es mucha molestia, una duda mas, a partir de la consulta que me muestra cantidad de grupos quiero hacer esto cantGrupos > 0, lo intente usando el WHERE cantGrupos > 0 pero me marca un error(#1054 - Unknown column 'cantgrupos' in 'where clause'), como puedo hacer un filtro a partir del conteo de grupos?, gracias por la ayuda

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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.