我有一个简单的查询:
$this->qb->select('l.value')
->addSelect('count(l) AS cnt')
->addSelect('hour(l.time) AS date_hour')
->from(Logs::class, 'l')
->where('l.header = :header')
->groupBy('l.value')
->addGroupBy('date_hour')
->setParameter('header', 'someheader')
此代码选择3列具有一个条件和两个groupBy。
我要获取此查询的记录数。当然,我不想下载所有记录并检查下载数据的大小。
问题: 如何重建此查询并以singleScalarValue()的形式从db获取结果?
答案 0 :(得分:1)
我认为您应该在此处使用(id列进行计数)
->addSelect('count(l) AS cnt')
类似的事情,但是如果您显示实体,我可以建议正确的解决方案:
$this->qb->select('l')
->addSelect('count(l.id) AS cnt')
->addSelect('hour(l.time) AS date_hour')
->from(Logs::class, 'l')
->where('l.header = :header')
->groupBy('l.value')
->addGroupBy('date_hour')
->setParameter('header', 'someheader')
$count = $qb->getQuery()->getSingleScalarResult();
答案 1 :(得分:0)
由于GROUP BY + COUNT + getSingleScalarResult在DQL查询中似乎无法一起使用,因此我猜您最好的选择是事后计算
$sub
->select('l.id')
->addSelect('l.value as hidden val')
->addSelect('hour(l.time) AS hidden date_hour')
->from(Logs::class, 'l')
->where('l.header = :header')
->groupBy('val')
->addGroupBy('date_hour')
->setParameter('header', 'someheader')
;
$subIds = array_column($sub->getQuery()->getResult(), 'id');
$count = count($subIds);