首先我知道这是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)
总而言之,我需要从单个表中的多个列中选择所有唯一值,然后输出所有结果值以及每个值的总计数。
任何帮助都非常感谢!
答案 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),...']
}