Left Join只返回一行

时间:2012-10-16 22:16:19

标签: php mysql sql count left-join

我正在尝试加入两个表格。我想要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 个答案:

答案 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列表中明确说明您实际需要的列。