MySQL 跨多个列对唯一项进行分组,每个列有 COUNT 个?

MySQL to group unique items across multiple columns with COUNTs for each?

首先我知道这是 MySQL 我知道我应该使用 MySQLi...所以请原谅我...

我整天都在为这个绞尽脑汁,我相信它应该很简单。我有 table 个产品,每个产品在 table 中都有列,例如颜色、material、尺寸等

我想在显示结果时创建一个 sidebar/filter,这样用户可以过滤结果说只显示 "red" 产品,或只显示金属产品等。

我已经让 mysql/php 动态地执行此操作,但我无法终生弄清楚如何在其中使用 COUNT 来显示每个的数量。

我想要的是,如果您单击一个类别并且该类别中有 10 个产品,该语句将基于这 10 个产品(仅显示唯一性)的所有各种属性(列)创建一个动态过滤器,如下所示:

Colour:
Red (2)
Yellow (4)
Pink (1)
Blue (1)
Green (2)

Material:
China (3)
Paper (2)
Metal (5)

我有有效的代码,但没有每个代码的计数:

$sql=mysql_query("SELECT
    (SELECT GROUP_CONCAT(DISTINCT colour) FROM $table_products_description WHERE products_id IN (".$ids.")) as Colour, 
    (SELECT GROUP_CONCAT(DISTINCT material) FROM $table_products_description WHERE products_id IN (".$ids.")) as Material");

foreach(mysql_fetch_assoc($sql) as $key=>$value)
{
    $html.='<h3>'.$key.'</h3>';
    $subvals=explode(",",$value);
    foreach($subvals as $subval)
    {
        $html.='<p>'.$subval.'</p>';
    }
}

其中 $ids 是任何给定类别或搜索结果的产品 ID 数组。

显示这个结果很好,但每个都没有计数:

**Colour**
Red
White
Blue
Green
Yellow
Black
Orange

**Material**
Fine Bone China
Ceramic
Cast Iron
Porcelain

我可以只用 1 列就可以很好地工作,使用如下完全不同的语句,但是我怎样才能将它扩展到多列?

select group_concat( concat( colour,'(',qty,')') separator ', ') Colour
from (
  select colour, count(*) qty
  from $table_product_description
  group by colour
) s

上面显示了每个值和计数,但无论我尝试什么,我都无法让上面的内容在很多列中工作。有什么想法吗?

**Colour**
Red (3)
White (1)
Blue (2)
Green (1)
Yellow (1)
Black (1)
Orange (1)

总而言之,我需要 select 单个 table 中多个列的所有唯一值,然后输出所有结果值以及每个值的总计数。

非常感谢任何帮助!

尝试使用 group by

"select 
 (
   select color,
     count(*) as rowcount 
   from $table_products_description 
   where products_id 
   in ($ids) 
   group by color
 ) as Color,
 (
   select material, 
     count(*) as rowcount 
   from $table_products_description 
   where products_id 
   in ($ids) 
   group by material
 ) as Material"

您不能在一行中聚合(计数)两个不同的事物。此查询...

SELECT 'Colour' AS category, colour AS value, count(*) AS qty
FROM $table_product_description
WHERE products_id IN($ids)
GROUP BY colour
UNION ALL
SELECT 'Material' AS category, material AS value, count(*) as qty
FROM $table_product_description
WHERE products_id IN($ids)
GROUP BY material

...会给你这样的东西:

category | value | qty
Colour   | red   | 5
Colour   | blue  | 3
Material | metal | 2
Material | paper | 6

如果您想使用 group_concat(),您可以将此查询包装成:

SELECT a.category, group_concat( concat( a.value,'(',a.qty,')') separator ', ') AS list
FROM (
    ...above query...
) AS a
GROUP BY a.category

数据访问

mysql_fetch_assoc($sql) returns 每次调用一行,如果没有(更多)要获取的内容,则返回 false。 通常使用 while() 循环完成,如下所示:

while ($row = mysql_fetch_assoc($sql)) {
    //For combined query $row in each iteration becomes:
    // 1: ['category' => 'Colour', 'list' => 'red(5), blue(3)']
    // 2: ['category' => 'Material', 'list' => 'metal(2),...']
}