【问题标题】:COUNT and GROUP BY using Zend Framework 2 and tableGateway使用 Zend Framework 2 和 tableGateway 进行 COUNT 和 GROUP BY
【发布时间】:2013-05-28 06:08:03
【问题描述】:

在 Zend Framework 2 中,使用 tableGateway,我想运行以下 SQL 查询:

  SELECT categories.category_name, COUNT(forums.forum_id)
    FROM categories LEFT JOIN forums
      ON categories.category_id = forums.category_id
GROUP BY categories.category_name;

问题是我根本不知道该怎么做。例如,我知道如何使用$select->join(),但我不知道如何使用COUNTGROUP BY

我对 SQL 的要求:我有 2 个表; categoriesforums。我想从categories 中选择所有类别,并为每个类别选择论坛的数量。

【问题讨论】:

标签: zend-framework2


【解决方案1】:

另一个论坛上的某个人给了我正确的答案,这对我有用。以为我会分享它,以防其他人有类似的问题。这是我现在的样子:

use Zend\Db\Sql\Expression;

$resultSet = $this->tableGateway->select(function (Select $select)
{
    // Select columns and count the forums.
    $select->columns(array(
        'category_name',
        'forumsCount' => new Expression('COUNT(forums.forum_id)')
    ));

    // Left-join with the forums table.
    $select->join('forums', 'categories.category_id = forums.category_id', array(), 'left');

    // Group by the category name.
    $select->group('categories.category_name');
});

return $resultSet;

【讨论】:

  • 你能分享那个链接吗,这样我们就可以得到其他的东西,比如限制,哪里和所有......
  • @kumar 我的问题不涉及limitwhere 语句,所以它也不在答案中。
  • 我们如何在块内传递参数
  • @khunshan 只需将use ($var) 添加到我的答案代码第一行的最后。变量$var可以在方法中定义在tableGateway函数之前,也可以来自方法的参数。
  • 是的,我明白了。我们必须在闭包中传递作用域。谢谢@Nic
【解决方案2】:

您的查询看起来正确。当您直接在数据库上运行它时,它是否按预期工作。

我认为您可能只需要使用适配器执行原始查询。

$sql = "SELECT categories.category_name, COUNT(forums.forum_id) FROM categories LEFT JOIN forums ON     categories.category_id = forums.category_id GROUP BY categories.category_name";

$statement = $this->adapter->query($sql);
return $statement->execute();

【讨论】:

  • 很遗憾,我无法让它与 tableGateway 一起使用。我真的希望使用可用的方法,而不是放下实际的 SQL。是的,当我在 PhpMyAdmin 中运行查询时,它工作得很好。
猜你喜欢
  • 2015-10-30
  • 2017-02-24
  • 2012-11-24
  • 2021-10-02
  • 2014-11-14
  • 1970-01-01
  • 2016-10-11
  • 2014-06-08
  • 1970-01-01
相关资源
最近更新 更多