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>';
          }

        ?>

我已经为此工作了几个小时,并且非常感谢任何关于我做错了什么的帮助。

4

1 回答 1

4

在没有GROUP BY子句的情况下,COUNT()聚合只能返回一行,包含该子句过滤后的表的总数WHERE。我怀疑你的意思GROUP BY b.category_idLEFT 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

GROUP BY这是因为 MySQL 对子句的内容和存在很宽容,所以您的查询首先在语法上是成功的。由于缺少GROUP BY. 根据您的表的内容product_category,MySQL 可能允许您在没有连接子查询的情况下执行上述操作,而是product_categoryGROUP BY子句中包含正确的列,但在不知道该表的内容的情况下我不能确定,并且上述方法是标准的,并且可以跨其他 RDBMS 移植,而无需依赖 MySQL 的宽大处理。

最后一点,虽然我已经在上面做了,但我从不建议SELECT *JOIN查询中做。连接表之间的公共列名需要别名以在 PHP API 中进行区分,从而引起混淆。始终最好明确说明您在列表中实际需要的SELECT列。

于 2012-10-16T22:58:22.013 回答