我正在尝试加入两个表格。我想要product_category
表中的所有列(现在总共有6个)并计算products_has_product_category
表中每个类别中的产品数量CatCount。我的查询结果是1行,第一个类别,总计数为68,当我要查找6行时,每个类别的计数。
<?php
$result = mysql_query("
SELECT a.*, COUNT(b.category_id) AS CatCount
FROM `product_category` a
LEFT JOIN `products_has_product_category` b
ON a.product_category_id = b.category_id
");
while($row = mysql_fetch_array($result)) {
echo '
<li class="ui-shadow" data-count-theme="d">
<a href="' . $row['product_category_ref_page'] . '.php" data-icon="arrow-r" data-iconpos="right">' . $row['product_category_name'] . '</a><span class="ui-li-count">' . $row['CatCount'] . '</span></li>';
}
?>
我一直在研究这个问题几个小时,非常感谢我对我做错的任何帮助。
答案 0 :(得分:3)
如果没有GROUP BY
子句,COUNT()
聚合只能返回一行,在按WHERE
子句过滤后保留表的总计数。我怀疑你的意思是GROUP BY b.category_id
LEFT JOIN
对子查询:
SELECT
a.*,
catcount
FROM
product_category a
LEFT JOIN (
SELECT category_id, COUNT(*) AS catcount
FROM products_as_product_category
GROUP BY category_id
) subcount ON a.product_category_id = subcount.category_id
这是因为MySQL对GROUP BY
子句的内容和存在感到宽容,因为您的查询首先在语法上是成功的。由于缺少GROUP BY
,它在大多数其他RDBMS中都会失败。根据表product_category
的内容,MySQL可能允许您在没有连接子查询的情况下执行上述操作,而是在product_category
子句中包含GROUP BY
中的正确列,但不知道该表的内容我无法确定,并且上述方法是标准的,可以在其他RDBMS上移植而不依赖于MySQL的宽容。
最后一点,虽然我已在上面做过,但我从不建议在SELECT *
查询中执行JOIN
。连接表之间的公用列名需要别名来区分PHP API,从而引起混淆。最好在SELECT
列表中明确说明您实际需要的列。