4

如何使用 HAVING 子句计算查询中的行数?

我有一个查询来获取如下所示的分页数据(但稍微复杂一点):

$qb = $this->em->createQueryBuilder()
    ->select('p')
    ->from('Application\Entity\Modules_ProductVersions', 'p', 'p.id')
    ->leftJoin('p.stocks', 's')
    ->groupBy('p.id')
    ->having('SUM(s.stock) > 0');
$qb->setMaxResults($limit)
    ->setFirstResult($page * $limit);

我想另外计算行数,比如:(虽然会触发错误:类'('未定义):

SELECT COUNT(x) FROM (
SELECT p.id
FROM Application\Entity\Modules_ProductVersions p
LEFT JOIN p.stocks s
GROUP BY p.id
HAVING SUM(s.stock) > 0
) x

如何使用已经构建的查询轻松做到这一点?

我已经使用生成的 SQL 进行了管理:

foreach($query->getParameters() as $param) {
    $params[] = $param->getValue();
};
$count = $this->em->getConnection()->fetchColumn(
    'SELECT COUNT(i) FROM ('.$query->getSQL().') i',
    $params
);

但我更喜欢一些 QueryBuilder 或至少 DQL 方法。

4

2 回答 2

4

试试这个:

SELECT count(p1.*) 
FROM Application\Entity\Modules_ProductVersions p1 
WHERE p1.id IN (
    SELECT p.id
    FROM Application\Entity\Modules_ProductVersions p
    LEFT JOIN p.stocks s
    GROUP BY p.id
    HAVING SUM(s.stock) > 0
);
于 2013-09-16T12:08:32.487 回答
2

使用 Refał IN 子句建议,我已经设法在 QueryBuilder 中做到了:

$count = $this->em->createQueryBuilder()
    ->select('COUNT(x)')
    ->from('Application\Entity\Modules_ProductVersions', 'x')
    ->where($qb->expr()->in('x.id', $qb->getDQL()))
    ->setParameters($qb->getParameters())
    ->getQuery()->getSingleScalarResult();

可以简化吗?

于 2013-09-16T12:18:21.853 回答