Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用group by获得多个结果集?多栏分组_Php_Mysql_Sql_Database_Group By - Fatal编程技术网

Php 如何使用group by获得多个结果集?多栏分组

Php 如何使用group by获得多个结果集?多栏分组,php,mysql,sql,database,group-by,Php,Mysql,Sql,Database,Group By,我有一个名为product的表,其中包含以下数据 pid brand color 1 sony white 2 casio gray 3 xoxo blue 4 samsung white 5 mvc silver 6 sony gray 7

我有一个名为product的表,其中包含以下数据

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 pid品牌颜色 1索尼白色 2卡西奥·格雷 3xoxo蓝 4三星白色 5 mvc银牌 6索尼灰色 7 xoxo红 8三星银 9 mvc白色 我需要得到属于每个品牌和颜色的产品总数。所以我写了两个不同的查询

Select count(pid) as total from products group by brand; Select count(pid) as total from products group by color; 按品牌从产品组中选择计数(pid)作为总计; 按颜色从产品组中选择计数(pid)作为总计;
这个很好用。但由于我的产品表数据非常庞大,我认为通过一个查询就可以实现这一点会更好。有可能吗?

可以使用with语句,但在编写此答案时,MySQL中没有这一功能。

您可以简单地将这两个查询结合起来:

( 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

根据表的实际大小,首先获取品牌/颜色组合的总数并将其存储到临时表中,然后查询临时表两次以按每个条件查找最终总数可能会更便宜

就是这样,

-- 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

按两个不同的列分别分组会导致两个根本不同的查询,因此从数据库的角度来看,单独运行它们更容易。我会考虑创建两个索引(一个关于品牌,一个关于颜色)来帮助解决这个问题。

这个问题有些令人困惑。当你说“获取属于每个品牌和颜色的产品总数”时,你的意思是单独获取数量还是先将品牌分组,然后按颜色分组,然后获取数量?好的,我会澄清。我需要分开数数。即:每个品牌的产品总数和每个颜色的产品总数。不是品牌和颜色的组合。我认为MySQL没有分区。@PMV:你是对的,它是为数不多的不支持窗口功能的DBMS之一。这仍然不会给你一个有用的结果集。您将得到与原始表一样多的行,其中恰好有该行的品牌和颜色计数。然后,您必须添加一个group by,您可能会得到一个比单独运行selects更昂贵的查询。实际上不是这样的:over()运算符使其等同于单独编写两个查询。但同样,MySQL中不可用。虽然值是正确的,但返回的每个产品仍有一行。您好。谢谢你的回答。我有一个疑问。与使用两个单独的查询相比,使用union的优势是什么?它会带来更好的性能吗?实际上,我在这个例子中提到的品牌和颜色是产品属性。在我的实际表格中,共有6个属性。那么,哪种方法更好呢?所有6个查询或6个单独查询的联合查询?在总和处添加计数。这只是我在项目中看到的一个通用查询,可以在任何地方应用
select 
count(*) over (partition by product), 
count(*) over (partition by color)
from table
select brand as `group`, count(pid) from products group by brand
union all
select color as `group`, count(pid) from products group by color
$sql = "SELECT col_1, SUM(col_2), SUM(col_3) FROM table_name GROUP BY(col_1)";