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

[SOLUCIONADO] COUNT que retorne 0 cuando no hay registros

Estas en el tema de COUNT que retorne 0 cuando no hay registros en el foro de Mysql en Foros del Web. Hola Compañeros(as)! Les cuento, estoy haciendo esta consulta en Mysql: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT B.id_seccion , COUNT ( B.id_persona ) AS total ...
  #1 (permalink)  
Antiguo 23/07/2013, 15:24
Avatar de neglivv  
Fecha de Ingreso: julio-2011
Mensajes: 103
Antigüedad: 12 años, 9 meses
Puntos: 11
COUNT que retorne 0 cuando no hay registros

Hola Compañeros(as)!

Les cuento, estoy haciendo esta consulta en Mysql:
Código MySQL:
Ver original
  1. SELECT B.id_seccion, COUNT(B.id_persona) AS total
  2.        FROM tbl_personas_seccion AS B, sist_usuario AS C
  3.        WHERE C.cedula = B.id_persona AND C.activo='SI'
  4.        AND B.id_persona!= '123123' AND
  5.        B.id_seccion IN (1,2)
  6.        GROUP BY B.id_seccion

para saber la cantidad de estudiantes en las secciones. La cuestión es que cuando una sección no tiene estudiantes simplemente no se incluye en lo que retorna la consulta. Ejemplo: sección 1,2. La 2 no tiene estudiantes, y retorna:
Cita:
Editado: Codigo de programación no permitido en foros de Bases de Datos.
Como hago para que aparezca la sección 2 con total = 0???

De antemano gracias!

Última edición por gnzsoloyo; 23/07/2013 a las 17:26
  #2 (permalink)  
Antiguo 23/07/2013, 17:29
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: COUNT que retorne 0 cuando no hay registros

LEFT JPON te devuelve todo lo que tenga la izquierda, haya o no relaciones con la derecha. En el contexto de las condiciones dadas, si al menos hay un registro de la izquierda, devolverá cero en el COUNT(), pero para eso debes contar sobre la derecha, para que el NULL de cero.
Código MySQL:
Ver original
  1. SELECT B.id_seccion, COUNT(C.cedula) total
  2. FROM tbl_personas_seccion B LEFT JOIN sist_usuario C ON C.cedula = B.id_persona
  3. WHERE C.activo='SI'
  4.        AND B.id_persona!= '123123'
  5.        AND B.id_seccion IN (1,2)
  6. GROUP BY B.id_seccion
__________________
¿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 23/07/2013, 19:02
Avatar de neglivv  
Fecha de Ingreso: julio-2011
Mensajes: 103
Antigüedad: 12 años, 9 meses
Puntos: 11
Respuesta: COUNT que retorne 0 cuando no hay registros

Gracias por tu respuesta, gnzsoloyo. Lo intenté pero me sigue dando el mismo resultado, solo me muestra el total de la sección 1, y nada de la 2

Alguna otra sugerencia?
  #4 (permalink)  
Antiguo 23/07/2013, 19:29
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: COUNT que retorne 0 cuando no hay registros

Código MySQL:
Ver original
  1. SELECT B.id_seccion, COUNT(C.cedula) total
  2. FROM tbl_personas_seccion B LEFT JOIN sist_usuario C ON B.id_persona = C.cedula  
  3. WHERE B.id_persona!= '123123'
  4.        AND B.id_seccion IN (1,2)
  5.        AND
  6.            (C.activo='SI'
  7.             OR C.cedula IS NULL # Necesario para que devuelva los registros nulos de la segunda tabla
  8.             )
  9. GROUP BY B.id_seccion
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 23/07/2013 a las 19:41
  #5 (permalink)  
Antiguo 25/07/2013, 09:05
Avatar de neglivv  
Fecha de Ingreso: julio-2011
Mensajes: 103
Antigüedad: 12 años, 9 meses
Puntos: 11
Respuesta: COUNT que retorne 0 cuando no hay registros

Más o menos guiándome por la consulta que sugieres, gnzsoloyo, hice esta que retorna los count que dan 0:

Código MySQL:
Ver original
  1. SELECT A.id_seccion, COUNT( B.id_persona ) AS total
  2. FROM tbl_seccion A
  3.         LEFT JOIN tbl_personas_seccion B ON A.id_seccion = B.id_seccion
  4.         AND B.id_persona !=  '123123'
  5.         AND A.id_seccion IN (1,2)
  6. GROUP BY B.id_seccion
Ahora tengo otro inconveniente , necesito verificar que la persona que se incluya en el COUNT esté activa. Para esto cuento con otra tabla:
sist_usuario la cual tiene: id_persona y activo ("SI" o "NO").
Intenté modificar la consulta anterior asi:

Código MySQL:
Ver original
  1. SELECT A.id_seccion, COUNT( B.id_persona ) AS total
  2. FROM sist_usuario Z,(tbl_seccion A
  3.         LEFT JOIN tbl_personas_seccion B ON A.id_seccion = B.id_seccion
  4.         AND B.id_persona !=  '".$_SESSION['persona']['cedula']."'
  5.         AND A.id_seccion IN (".implode(',',$id_secciones)."))
  6. WHERE  Z.cedula = B.id_persona AND Z.activo='SI'
  7. GROUP BY B.id_seccion
Pero vuelvo al principio no me retorna las secciones con 0 personas

Como seria entonces la consulta con esta nueva restricción? alguna sugerencia?

Última edición por gnzsoloyo; 25/07/2013 a las 09:31
  #6 (permalink)  
Antiguo 25/07/2013, 12:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: COUNT que retorne 0 cuando no hay registros

Hola neglivv:

No mezcles JOIN's implícitos con JOIN's explícitos... es decir, no vale hacer JOIN's y al mismo tiempo seguir poniendo en el FROM tablas separadas por comas...

Lo que tienes que hacer es algo como esto:

Código MySQL:
Ver original
  1. A.id_seccion, COUNT( C.id_persona ) AS total
  2. FROM tbl_seccion A
  3. LEFT JOIN tbl_personas_seccion B ON
  4.     A.id_seccion = B.id_seccion
  5. LEFT JOIN sist_usuario C ON C.id_persona = B.id_persona AND C.activo = 'SI'    
  6.     B.id_persona !=  '123123' AND
  7.     A.id_seccion IN (1,2)
  8. GROUP BY B.id_seccion;

o así:

Código MySQL:
Ver original
  1. A.id_seccion, COUNT( C.id_persona ) AS total
  2. FROM tbl_seccion A
  3. LEFT JOIN tbl_personas_seccion B ON
  4.     A.id_seccion = B.id_seccion AND
  5.     B.id_persona !=  '123123' AND
  6.     A.id_seccion IN (1,2)
  7. LEFT JOIN sist_usuario C ON C.id_persona = B.id_persona AND C.activo = 'SI'    
  8. GROUP BY B.id_seccion;

Haz la prueba y nos comentas

Saludos
Leo.
  #7 (permalink)  
Antiguo 25/07/2013, 12:49
Avatar de neglivv  
Fecha de Ingreso: julio-2011
Mensajes: 103
Antigüedad: 12 años, 9 meses
Puntos: 11
Sonrisa Respuesta: COUNT que retorne 0 cuando no hay registros

Lo he logrado!

Bueno, mas o menos guiándome por lo que me sugieren y por otras cosas que busque, lo hice con inner join:

Código MySQL:
Ver original
  1. SELECT secciones.seccion, secciones.grado, secciones.id_grado, A.id_seccion, COUNT( A.id_persona ) -1 AS TOTAL
  2. FROM tbl_personas_seccion A
  3. SELECT B.id_seccion, C.seccion, D.grado, D.id_grado
  4. FROM tbl_personas_seccion B, tbl_seccion C, sist_grado D
  5. WHERE B.id_persona =  "12134567"
  6. AND C.id_seccion = B.id_seccion
  7. AND C.activa =  "SI"
  8. AND C.id_grado = D.id_grado
  9. )secciones ON secciones.id_seccion = A.id_seccion
  10. GROUP BY A.id_seccion

Le cambie el enfoque a la consulta, tratando de obtener de una vez los datos de las secciones dirigidas por el usuario con id = 12134567, y así evitar hacer dos consultas.
En este caso esto restando -1 al count para que no cuente a la persona que dirige la sección (la del id.persona = 12134567).

De nuevo gracias por la ayuda

Última edición por gnzsoloyo; 25/07/2013 a las 13:10

Etiquetas: count, registros, retorne, select, sql
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:39.