php - 左连接只返回一行

标签 php mysql sql count left-join

我正在尝试连接两个表。我想要 product_category 表中的所有列(现在共有 6 个)并计算 products_has_product_category 中每个类别中的产品数量 CatCount table 。我的查询结果是包含第一个类别的 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>';
          }

        ?>

我已经为此工作了几个小时,非常感谢对我做错的任何帮助。

最佳答案

在没有 GROUP BY 子句的情况下,COUNT() 聚合只能返回一行,保存由 过滤后的表的总计数WHERE 子句。我怀疑您的意思是在针对子查询的 LEFT JOINGROUP 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,它在大多数其他 RDBMS 中都会失败。根据表 product_category 的内容,MySQL 可能允许您在没有连接子查询的情况下执行上述操作,而是在 GROUP 中包含来自 product_category 的正确列BY 子句,但不知道该表的内容我不能肯定地说,并且上述方法是标准的并且可以跨其他 RDBMS 移植,而不依赖于 MySQL 的宽容度。

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

关于php - 左连接只返回一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924299/

相关文章:

sql - 如何使用 object_id 函数从临时表中获取对象 ID

php - 在两个表中搜索并检索主表结果: Laravel

php - 如何让 Doctrine 在 Symfony2 中记录查询

php - XDebug PHP Eclipse - 错误没有找到合适的文件或没有选择文件

PHP内置网络服务器运行速度很慢

mysql - UNION 生成重复行

php - 如何标记一个表中不在另一表 (mySQL) 中的值?

php - 我应该如何将我的 mysql 数据库设置为我的 php 文档模板?

mysql - 如何删除 mysql 中表的列,其中该列的所有值为空。我有 38GB 的​​表,因此需要性能。

mysql:用与前一行相同的数字更新增量序列号