MySQL将多个列中的唯一项分组,每个列都有COUNT个?

时间:2016-06-29 20:06:03

标签: php mysql e-commerce

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

我整天都在绞尽脑汁,我相信它应该很简单。我有一个产品表,表格中列出了每种产品,如颜色,材料,尺寸等

我想在显示结果时创建侧边栏/过滤器,因此用户可以过滤结果,只显示" 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)

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

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:0)

尝试使用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"

答案 1 :(得分:0)

你不能在一行中聚合(计算)两个不同的东西。这个查询...

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)每次调用时返回一行,如果没有(更多)获取,则返回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),...']
}