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),...']
}
首先我知道这是 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),...']
}