左连接只返回一行

3

我正在尝试连接两个表。我想要从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>';
          }

        ?>

我已经在做这个工作几个小时了,非常希望能得到任何有关我做错了什么的帮助。
1个回答

4

如果没有GROUP BY子句,COUNT()聚合只能返回一行,该行包含在WHERE子句过滤后的表的总计数。我猜你是想在一个子查询的左连接中使用GROUP BY b.category_id

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,该查询将失败。根据您的product_category表的内容,MySQL可以允许您在没有连接子查询的情况下执行上述操作,并在GROUP BY子句中包含来自product_category的正确列。但是,由于我不知道该表的内容,因此无法确定。上述方法是标准且可移植到其他关系型数据库管理系统,而不依赖于MySQL的宽容度。
最后需要注意的是,尽管我在上面这样做了,但我永远不建议JOIN查询中使用SELECT *。连接表之间的常见列名需要使用别名来区分PHP API,从而引入混乱。最好始终明确指定实际需要的列在SELECT列表中。

我现在真想拥抱你!它完美地运行了。感谢您的建议,我将更改select *为单个列名。再次感谢您,特别是对您答案的详细解释,我喜欢学习原因而不仅仅是得到答案! - Adam
@Adam 很高兴能帮忙。如果你提出问题后只得到代码解决方案而没有解释(解决方案+解释=答案),不要害怕向回答者追问其如何以及为什么有效。我真的相信这将提高 Stack Overflow 的整体质量。 - Michael Berkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接