如何使用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方法。
答案 0 :(得分:3)
试试这个:
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
);
答案 1 :(得分: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();
可以简化吗?