¿Cómo usar el grupo para obtener un conjunto de resultados múltiples? agrupación en varias columnas

Tengo una tabla nombrada como producto que contiene los siguientes datos

pid brand color 1 sony white 2 casio grey 3 xoxo blue 4 samsung white 5 mvc silver 6 sony grey 7 xoxo red 8 samsung silver 9 mvc white

Necesito obtener el recuento total de productos que pertenecen a cada marca y color. Entonces escribí 2 consultas diferentes.

Seleccione el recuento (pid) como total del grupo de productos por marca; Seleccione el recuento (pid) como total del grupo de productos por color;

Esto funciona bien. Pero dado que los datos de mi tabla de productos son enormes, creo que es mejor si puedo lograr esto con una sola consulta. ¿Es posible?

preguntado el 10 de mayo de 11 a las 13:05

La pregunta es algo confusa. Cuando dice "obtener el recuento total de productos que pertenecen a cada marca y color", ¿quiere decir obtener los recuentos por separado o agrupar la marca primero y luego agrupar por color y luego obtener el recuento? -

Ok, lo dejaré claro. Necesito contar por separado. es decir. El recuento total de productos pertenece a cada marca y el recuento total de productos pertenece a cada color. No es la combinación de la marca y el color. -

7 Respuestas

Podrías simplemente tener el UNION de estas dos consultas:

( SELECT 1        AS groupType
       , brand    AS grp
       , count(*) AS total
  FROM products 
  GROUP BY brand
)
UNION ALL
( SELECT 2        AS groupType
       , color    AS grp
       , count(*) AS total
  FROM products 
  GROUP BY color
)
ORDER BY groupType
       , grp

Si desea la cantidad de productos para cada combinación de marca y color, debe tener la tabla agrupada por estos dos campos:

SELECT brand
     , color
     , count(*) AS total
FROM products 
GROUP BY brand
       , color

contestado el 10 de mayo de 11 a las 17:05

Hola. Gracias por tu respuesta. Tengo una duda aqui. ¿Cuál es la ventaja de usar la unión sobre el uso de 2 consultas separadas? ¿Dará como resultado un mejor rendimiento? En realidad, la marca y el color que mencioné en este ejemplo son atributos del producto. En mi tabla actual hay 6 atributos en total. Entonces, ¿qué enfoque será mejor? ¿Una consulta conjunta de las 6 consultas o 6 consultas individuales? - PG

Dependiendo de cuán grande sea realmente su tabla, podría ser más barato obtener los totales de las combinaciones de marca / color primero y almacenarlos en una tabla temporal, y luego consultar la tabla temporal dos veces para encontrar los totales finales por cada criterio.

Es decir, algo como esto:

-- create a temporary table (omitted)

INSERT INTO temp_table (brand, color, total)
SELECT brand, color, COUNT(*) AS total
FROM products
GROUP BY brand, color

SELECT brand, SUM(total) AS total
FROM temp_table
GROUP BY brand

SELECT color, SUM(total) AS total
FROM temp_table
GROUP BY color

contestado el 10 de mayo de 11 a las 21:05

select 
count(*) over (partition by product), 
count(*) over (partition by color)
from table

contestado el 10 de mayo de 11 a las 22:05

No creo que MySQL tenga partición. - Parris Varney

@PMV: tienes razón, es uno de los pocos DBMS que no admite funciones de ventana - un caballo sin nombre

select brand as `group`, count(pid) from products group by brand
union all
select color as `group`, count(pid) from products group by color

contestado el 10 de mayo de 11 a las 22:05

Agrupar por separado por dos columnas diferentes da como resultado dos consultas fundamentalmente diferentes, por lo que desde la perspectiva de la base de datos, es más fácil ejecutarlas por separado. Me gustaría crear dos índices (uno sobre la marca y otro sobre el color) para ayudar.

contestado el 10 de mayo de 11 a las 23:05

Es posible usar declaraciones con, pero esto no está disponible en MySQL en el momento de escribir esta respuesta.

contestado el 15 de mayo de 11 a las 13:05

Esto todavía no le daría un conjunto de resultados útil. Obtendría tantas filas como la tabla original, que tienen un recuento de la marca y el color de esa fila allí. Luego, tendría que agregar un grupo y probablemente tendrá una consulta aún más costosa que simplemente ejecutar las selecciones por separado. - John Gibb

En realidad no: el operador over () lo hace equivalente a escribir las dos consultas por separado. Pero nuevamente, no está disponible en MySQL. - Denis de Bernardy

Si bien los valores serán correctos, aún tendrá una fila para cada producto que regrese. - John Gibb

$sql = "SELECT col_1, SUM(col_2), SUM(col_3) FROM table_name GROUP BY(col_1)";

Respondido 09 Oct 15, 09:10

sumar el recuento en el lugar de la suma. esta es solo una consulta general que acabo de ver con mi proyecto que se puede aplicar en cualquier lugar: anjali

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.