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

Dos counts con diferentes condicionales en la misma consulta.

Estas en el tema de Dos counts con diferentes condicionales en la misma consulta. en el foro de Mysql en Foros del Web. Buenas! Tengo dos tablas; 1 - Categorias. 2 - Productos. Cada producto pertenece a una única categoría. Los productos pueden estar activos o inactivos . ...
  #1 (permalink)  
Antiguo 19/02/2012, 18:05
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 15 años, 10 meses
Puntos: 14
Dos counts con diferentes condicionales en la misma consulta.

Buenas!

Tengo dos tablas;

1 - Categorias.
2 - Productos.

Cada producto pertenece a una única categoría.
Los productos pueden estar activos o inactivos.

Estoy intentando construir una consulta SQL en la que obtenga:

nombre de la categoría, cantidad de productos de esa categoría, cantidad de productos inactivos de esa categoría.

¿Cómo podría hacer algo así?

Por ahora he conseguido que me muestre la cantidad total de productos...

Código PHP:
SELECT `nombreCategoria` as Categoriacount(*) as Total_Productos 
FROM 
`categorias`, `productos
WHERE `productos`.`idCategoria`=`categorias`.`idCategoria`
GROUP BY Categoria 
Gracias!
  #2 (permalink)  
Antiguo 19/02/2012, 18:13
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 15 años, 10 meses
Puntos: 14
Respuesta: Dos counts con diferentes condicionales en la misma consulta.

Vale, nada. Ya me ha salido... xD

Código PHP:
SELECT `categorias`.`idCategoria` as idCat, `nombreCategoria` as nomCat
(
SELECT count(*) from productos where productos.`idCategoria`=idCat) as productosTotales
(
SELECT count(*) from productos where productos.`idCategoria`=idCat AND productos.`estadoProducto`='inactivo' ) as productosInactivos
FROM `categorias`
GROUP BY idCat 
  #3 (permalink)  
Antiguo 19/02/2012, 18: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, 4 meses
Puntos: 2658
Respuesta: Dos counts con diferentes condicionales en la misma consulta.

La forma ortodoxa sería invocando la tabla producto dos veces, una para verlo los activos yotra los inactivos. Pero desde el punto de vista de la performance no es buena idea porque implicaría hacer dos table scanning para buscar datos demasiado simples.
Hay una forma, que en realidad es medio un truco: Usar IF() y SUM():
Código MySQL:
Ver original
  1.    `nombreCategoria` Categoria,
  2.         SUM(IF(P.estado = 'I', 1, 0)) Inactivos,
  3.         SUM(IF(P.estado = 'A', 1, 0)) Activos,
  4.         COUNT(*) Total_Productos
  5. FROM `categorias` C INNER JOIN  `productos` P ON  C.`idCategoria`=P.`idCategoria`
  6. GROUP BY Categoria
Esto, suponiendo que la tabla producto tiene un campo "estado", de tipo CHAR(1), que guarda "A" o "I", según sea el caso. Si lo haces de otro modo, entonces debes poner en la condición del IF() lo que corresponda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 19/02/2012, 18:16
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, 4 meses
Puntos: 2658
Respuesta: Dos counts con diferentes condicionales en la misma consulta.

Cita:
Iniciado por Urdaris_Nox Ver Mensaje
Vale, nada. Ya me ha salido... xD

Código PHP:
SELECT `categorias`.`idCategoria` as idCat, `nombreCategoria` as nomCat
(
SELECT count(*) from productos where productos.`idCategoria`=idCat) as productosTotales
(
SELECT count(*) from productos where productos.`idCategoria`=idCat AND productos.`estadoProducto`='inactivo' ) as productosInactivos
FROM `categorias`
GROUP BY idCat 
Esto que has hecho, puede parecer una buena idea, pero es una de las peores formas de consulta a realizar: subconsultas en el SELECT.
Evitalas tanto como puedas. Son casi una peste.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 19/02/2012, 18:24
 
Fecha de Ingreso: diciembre-2010
Ubicación: Gavà
Mensajes: 74
Antigüedad: 13 años, 4 meses
Puntos: 3
Has de usar subconsultas

Etiquetas: condicionales, select, sql, tabla
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 15:25.