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

Agrupar y contar

Estas en el tema de Agrupar y contar en el foro de Mysql en Foros del Web. Usando count, group by y un join he conseguido para cada registro de la tabla A, contar los registros que existen en la tabla B, ...
  #1 (permalink)  
Antiguo 15/09/2010, 23:51
 
Fecha de Ingreso: agosto-2008
Ubicación: Puebla, Mexico.
Mensajes: 84
Antigüedad: 15 años, 8 meses
Puntos: 0
Agrupar y contar

Usando count, group by y un join he conseguido para cada registro de la tabla A, contar los registros que existen en la tabla B, pero tengo el problema que cuando no existen registros de A en B no me devuelve nada y me gustaria que me devolviera al menos null, para que quede un poco mas claro adjunto el siguiente ejemplo.

Código MySQL:
Ver original
  1. tabla_a
  2. id_a    columna_a
  3. 1       contenido con id1
  4. 2       contenido con id2
  5. 3       contenido con id3
  6. 4       contenido con id4
  7.  
  8. tabla_b
  9. id_b    a_id    columna_b
  10. 1       1       contenido con id1
  11. 2       1       contenido con id2
  12. 3       2       contenido con id3
  13. 4       2       contenido con id4
  14. 5       2       contenido con id5
  15. 6       3       contenido con id6
  16.  
  17. resultado esperado
  18. a_id    total_a_en_b
  19. 1       2
  20. 2       3
  21. 3       1
  22. 4       null

Alguna sugerencia?
  #2 (permalink)  
Antiguo 16/09/2010, 03:15
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, 5 meses
Puntos: 2658
Respuesta: Agrupar y contar

Hay formas, pero para poder darte una idea en tu caso, tienes que postear la consulta que usas...
__________________
¿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 16/09/2010, 03:33
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 9 meses
Puntos: 150
Respuesta: Agrupar y contar

Probablemente estes usando el famoso INNER JOIN cuando deberias usar LEFT JOIN que muestra todos los registros de tablas enlazadas aunque algunos no tengan correspondencia en la segunda tabla.
  #4 (permalink)  
Antiguo 16/09/2010, 11:40
 
Fecha de Ingreso: agosto-2008
Ubicación: Puebla, Mexico.
Mensajes: 84
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Agrupar y contar

Aqui esta la query que estoy usando

Código MySQL:
Ver original
  1. SELECT id_a,  count(a_id) AS total_a_en_b from tabla_b
  2.     LEFT JOIN tabla_a
  3.         ON id_a = a_id
  4.     GROUP BY a_id


Cuando no existen registros de A en B no me devuelve de plano nada.
  #5 (permalink)  
Antiguo 16/09/2010, 11:47
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Agrupar y contar

SELECT tabla_a.id_a, count(tabla_b.a_id) as total_a_en_b FROM tabla_a
LEFT JOIN tabla_b
ON tabla_a.id_a = tabla_b.a_id
GROUP BY tabla_a.id_a

El orden de los términos en un left join es muy importante. Prueba esto a ver si lo saca.
  #6 (permalink)  
Antiguo 16/09/2010, 12:12
 
Fecha de Ingreso: agosto-2008
Ubicación: Puebla, Mexico.
Mensajes: 84
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Agrupar y contar

Si eso tambien lo habia tomado en cuenta, incluso invirtiendo con right join, cuando hago la union 'simple' no hay problema, me devuelve null en los casos que no haya correspondencia, el problema viende cuando utilizo count() , si no encuentra registros entonces no me devuelve nada.

Necesito la query para una lista de programas, necesito listar todos los programas creados y cuando cursos tiene cada programa (0 si no tiene cursos aun), mediante codigo se puede hacer y mas rapido, pero se ve poco ortodoxo el metodo xD.
  #7 (permalink)  
Antiguo 16/09/2010, 12:17
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, 5 meses
Puntos: 2658
Respuesta: Agrupar y contar

Probemos así:
Código MySQL:
Ver original
  1. SELECT tabla_a.id_a, SUM(IF(tabla_b.a_id IS NOT NULL, 1, 0)) total_a_en_b
  2. FROM tabla_a LEFT JOIN tabla_b ON tabla_a.id_a = tabla_b.a_id
  3. GROUP BY tabla_a.id_a;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 16/09/2010, 12:21
 
Fecha de Ingreso: agosto-2008
Ubicación: Puebla, Mexico.
Mensajes: 84
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Agrupar y contar

RESUELTO


xD no me habia dado cuenta por que parametro estaba agrupando jejeje, gracias a todos en serio, creo que los hice pensar por una cosa tan minima.
  #9 (permalink)  
Antiguo 16/09/2010, 12:22
 
Fecha de Ingreso: agosto-2008
Ubicación: Puebla, Mexico.
Mensajes: 84
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Agrupar y contar

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Probemos así:
Código MySQL:
Ver original
  1. SELECT tabla_a.id_a, SUM(IF(tabla_b.a_id IS NOT NULL, 1, 0)) total_a_en_b
  2. FROM tabla_a LEFT JOIN tabla_b ON tabla_a.id_a = tabla_b.a_id
  3. GROUP BY tabla_a.id_a;


Exacto ese era mi problema, estaba agrupando por otro parametro, encontramos la respuesta al mismo tiempo, gracias de verdad.

Etiquetas: agrupar, contar
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 20:09.