Как использовать group by для получения множества результатов?группировка по нескольким столбцам - PullRequest
2 голосов
/ 10 мая 2011

У меня есть таблица с именем продукта, которая содержит следующие данные

pid            brand     color      

1              sony      white
2              casio     gray
3              xoxo      blue
4              samsung   white
5              mvc       silver
6              sony      gray
7              xoxo      red
8              samsung   silver
9              mvc       white

Мне нужно получить общее количество продуктов, принадлежащих каждой марке и цвету.Итак, я написал 2 разных запроса.

Select count(pid) as total from products group by brand;
Select count(pid) as total from products group by color;

Это отлично работает.Но так как мои данные таблицы продуктов огромны, я думаю, что лучше, если я смогу достичь этого одним запросом.Возможно ли это?

Ответы [ 7 ]

2 голосов
/ 10 мая 2011

Вы можете просто получить UNION из этих двух запросов:

( 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

Если вам нужно количество продуктов для каждой комбинации бренда и цвета, таблица должна быть сгруппирована по следующим двум полям:

SELECT brand
     , color
     , count(*) AS total
FROM products 
GROUP BY brand
       , color
0 голосов
/ 09 октября 2015
$sql = "SELECT col_1, SUM(col_2), SUM(col_3) FROM table_name GROUP BY(col_1)";
0 голосов
/ 10 мая 2011

Группировка по двум разным столбцам приводит к двум принципиально различным запросам, поэтому с точки зрения базы данных их проще выполнять по отдельности.Я бы хотел создать два индекса (один по бренду, другой по цвету), чтобы помочь.

0 голосов
/ 10 мая 2011
select brand as `group`, count(pid) from products group by brand
union all
select color as `group`, count(pid) from products group by color
0 голосов
/ 10 мая 2011
select 
count(*) over (partition by product), 
count(*) over (partition by color)
from table
0 голосов
/ 10 мая 2011

В зависимости от того, насколько велика ваша таблица на самом деле, может быть дешевле сначала получить итоги по сочетаниям бренда / цвета и сохранить их во временной таблице, а затем дважды запросить временную таблицу, чтобы найти окончательные итоги по каждому критерию.

То есть примерно так:

-- 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
0 голосов
/ 10 мая 2011

Можно использовать с операторами, но это не доступно в MySQL на момент написания этого ответа.

...