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

Doble Count en un Select con 3 Tablas

Estas en el tema de Doble Count en un Select con 3 Tablas en el foro de Mysql en Foros del Web. Hola Amigos! Tengo una pregunta, acerca de como hacer u organizar una consulta con un select que realizo. Explico: Tengo 3 Tablas y sus campos ...
  #1 (permalink)  
Antiguo 18/08/2011, 13:10
Avatar de JJPichon  
Fecha de Ingreso: agosto-2011
Ubicación: Manzanillo, Colima
Mensajes: 7
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Doble Count en un Select con 3 Tablas

Hola Amigos!

Tengo una pregunta, acerca de como hacer u organizar una consulta con un select que realizo.

Explico:
Tengo 3 Tablas y sus campos

sisPerfiles
tCodPerfil
tCodEstatus

sisUsuarios
eCodUsuario
tCodPerfil

sisSeccionesPerfiles
tCodSeccion
tCodPerfil


Las tablas de sisUsuarios y sisSeccionesPerfiles las vinculo con sisPerfiles, donde un nuevo usuario y una nueva seccione se le asigna un perfil de la tabla sisPerfiles.

En la consulta, se busca obtener cuantos usuarios y secciones se encuentran dados de alta con los perfiles que ya existen.

Aqui mi consulta:

SELECT * FROM (
SELECT sp.tCodEstatus AS Estatus, sp.tCodPerfil, count(su.tCodPerfil) AS NumeroUsuarios,
count(ss.tCodPerfil) AS NumeroSecciones
FROM sisPerfiles sp
LEFT JOIN sisUsuarios su ON sp.tCodPerfil = su.tCodPerfil
LEFT JOIN sisSeccionesPerfiles ss ON sp.tCodPerfil = ss.tCodPerfil
GROUP BY sp.tCodEstatus, sp.tCodPerfil) AS n1
WHERE Estatus !='EL'

Aqui mis datos:

sisPerfiles
tCodPerfil | tEstatus
Perfil1-------AC
Perfil2-------AC
Perfil3-------AC

sisUsuarios
eCodUsuario | tCodPerfil
Usuario1-------Perfil1
Usuario1-------Perfil1
Usuario2-------Perfil2
Usuario3-------Perfil2
Usuario4-------Perfil3

sisSeccionesPerfiles
tCodSeccion | tCodPerfil
Seccion1-------Perfil1
Seccion1-------Perfil1
Seccion1-------Perfil1
Seccion1-------Perfil1
Seccion1-------Perfil1
Seccion1-------Perfil1
Seccion2-------Perfil2
Seccion2-------Perfil2
Seccion2-------Perfil2
Seccion3-------Perfil3

y este es el resultado de mi select:

Estatus | tCodPerfil | NumeroUsuarios | NumeroSecciones
AC ----- Perfil1 ------- 12 ------- 12
AC ----- Perfil2 -------- 6 -------- 6
AC ----- Perfil3 -------- 1 -------- 1

el error que muestra al momento de dar los resultados, multiplica el numero de ususarios por el numero de secciones y el resultado se muestra en esos mismos, ya que la Perfil1 tiene 2 usuarios y 6 secciones 2X6=12
la Perfil2 tiene 2 usuarios y 3 secciones 2X3=6
y la Perfil3 tiene 1 usuario y 1 sección 1X1=1

alguien puede ayudarme con mi consulta¿?

de ante mano, gracias!!

Última edición por JJPichon; 18/08/2011 a las 13:19
  #2 (permalink)  
Antiguo 18/08/2011, 13:25
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Doble Count en un Select con 3 Tablas

El COUNT sólo cuenta número de registros, creo que lo estás entendiendo mal. Si haces un group by de una tabla por un campo y haces dos count en el select vas a obtener siempre el mismo número en los dos, porque ambos tienen el mismo número de filas. Tienes que plantearlo de otro modo, de forma que cuentes en un select uno de los datos y en otro select otro. Los select pueden ser totalmente independientes o uno ser subselect del otro, pero lo que no puedes bajo ningún concepto es tenerlos los dos juntos, porque ya ves que el resultado es que ambos count devuelven lo mismo.

Espero que te valgan las indicaciones, un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #3 (permalink)  
Antiguo 18/08/2011, 13:26
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 3 meses
Puntos: 288
Respuesta: Doble Count en un Select con 3 Tablas

por que tCodPerfil esta en todas la tablas?
ahy me parece que tenes un problema de diseño, a menos que sea un caso muy puntual
  #4 (permalink)  
Antiguo 18/08/2011, 13:38
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 3 meses
Puntos: 288
Respuesta: Doble Count en un Select con 3 Tablas

una cosa asi tendrias que hacer:

select count(*) as usuarios, count(sisSeccionesPerfiles.tCodSeccion) as secciones
where ....joins
group by sisUsuarios.eCodUsuario

contar las secciones y agrupadas por usuario
  #5 (permalink)  
Antiguo 18/08/2011, 14:54
Avatar de JJPichon  
Fecha de Ingreso: agosto-2011
Ubicación: Manzanillo, Colima
Mensajes: 7
Antigüedad: 12 años, 8 meses
Puntos: 0
Busqueda Respuesta: Doble Count en un Select con 3 Tablas

Cita:
Iniciado por Patriarka Ver Mensaje
por que tCodPerfil esta en todas la tablas?
ahy me parece que tenes un problema de diseño, a menos que sea un caso muy puntual
Hola Patriarka!
En mi explicación quite mas elementos de las 3 tablas y solo utilice los que eran relevantes para el ejemplo, es por eso que los puse asi
  #6 (permalink)  
Antiguo 18/08/2011, 14:58
Avatar de JJPichon  
Fecha de Ingreso: agosto-2011
Ubicación: Manzanillo, Colima
Mensajes: 7
Antigüedad: 12 años, 8 meses
Puntos: 0
Sonrisa Respuesta: Doble Count en un Select con 3 Tablas

Cita:
Iniciado por vgonga1986 Ver Mensaje
El COUNT sólo cuenta número de registros, creo que lo estás entendiendo mal. Si haces un group by...
Hola vgonga1986!

Entonces me sugieres que realice los select por separado... En realidad ya había pensado hacer de esa manera, pero pensé que habría una manera de hacer la consulta en un solo select...

Continuo probando la manera de realizarlo en la misma consulta!
  #7 (permalink)  
Antiguo 18/08/2011, 16:09
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Doble Count en un Select con 3 Tablas

Claro que se puede hacer en un único select, pero con subselect. Realmente creo que la subconsulta que tienes ahí te sobra, esto es lo mismo que tienes ahí:
Código MySQL:
Ver original
  1. SELECT sp.tCodEstatus AS Estatus, sp.tCodPerfil, count(su.tCodPerfil) AS NumeroUsuarios, count(ss.tCodPerfil) AS NumeroSecciones
  2. FROM sisPerfiles sp
  3.    LEFT JOIN sisUsuarios su ON sp.tCodPerfil = su.tCodPerfil
  4.    LEFT JOIN sisSeccionesPerfiles ss ON sp.tCodPerfil = ss.tCodPerfil
  5. WHERE sp.tCodEstatus <> 'EL'
  6. GROUP BY sp.tCodEstatus, sp.tCodPerfil

Sólo para sacar el número de usuarios:
Código MySQL:
Ver original
  1. SELECT sp.tCodEstatus AS Estatus, sp.tCodPerfil, count(su.tCodPerfil) AS NumeroUsuarios
  2. FROM sisPerfiles sp
  3.    LEFT JOIN sisUsuarios su ON sp.tCodPerfil = su.tCodPerfil
  4. WHERE sp.tCodEstatus <> 'EL'
  5. GROUP BY sp.tCodEstatus, sp.tCodPerfil

Sólo para sacar el número de secciones:
Código MySQL:
Ver original
  1. SELECT sp.tCodEstatus AS Estatus, sp.tCodPerfil, count(ss.tCodPerfil) AS NumeroSecciones
  2. FROM sisPerfiles sp
  3.    LEFT JOIN sisSeccionesPerfiles ss ON sp.tCodPerfil = ss.tCodPerfil
  4. WHERE sp.tCodEstatus <> 'EL'
  5. GROUP BY sp.tCodEstatus, sp.tCodPerfil

Ambos:
Código MySQL:
Ver original
  1. SELECT NU.Estatus, NU.tCodPerfil, NU.NumeroUsuarios, NS.NumeroSecciones
  2.    (SELECT sp.tCodEstatus AS Estatus, sp.tCodPerfil, count(su.tCodPerfil) AS NumeroUsuarios
  3.    FROM sisPerfiles sp
  4.       LEFT JOIN sisUsuarios su ON sp.tCodPerfil = su.tCodPerfil
  5.    WHERE sp.tCodEstatus <> 'EL'
  6.    GROUP BY sp.tCodEstatus, sp.tCodPerfil) NU,
  7.    (SELECT sp.tCodEstatus AS Estatus, sp.tCodPerfil, count(ss.tCodPerfil) AS NumeroSecciones
  8.    FROM sisPerfiles sp
  9.       LEFT JOIN sisSeccionesPerfiles ss ON sp.tCodPerfil = ss.tCodPerfil
  10.    WHERE sp.tCodEstatus <> 'EL'
  11.    GROUP BY sp.tCodEstatus, sp.tCodPerfil) NS
  12. WHERE NU.tCodPerfil = NS.tCodPerfil

No lo he probado porque no tengo tiempo, pero creo seguro que las dos por separado funcionan, si la unión de las dos no funciona prueba de distintas formas, pero la idea va por ahí.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #8 (permalink)  
Antiguo 18/08/2011, 16:27
Avatar de JJPichon  
Fecha de Ingreso: agosto-2011
Ubicación: Manzanillo, Colima
Mensajes: 7
Antigüedad: 12 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Doble Count en un Select con 3 Tablas

Cita:
Iniciado por vgonga1986 Ver Mensaje
Claro que se puede hacer en un único select, ...
Hola vgonga1986!

He probado el código que me dejaste, y me ha funcionado al 1001% muchas Gracias por la ayuda!!

Etiquetas: count, php, 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 11:43.