5

我正在尝试这样做:

SELECT 
     userId, count(userId) as counter 
 FROM 
     quicklink 
 GROUP BY 
     userId 
 HAVING 
     count(*) >= 3'

在查询构建器的教义中,我得到了这个:

$query = $this->createQueryBuilder('q')
            ->select('userId, count(userId) as counter')
            ->groupby('userId')
            ->having('counter >= 3')
            ->getQuery();

        return $query->getResult();

这给了我这个错误:

[Semantical Error] line 0, col 103 near 'HAVING count(*)': Error: Cannot group by undefined identification variable.

真的在教义上挣扎。:(

4

5 回答 5

9

您的 SQL有效,您的查询生成器语句无效

All cause db 将按以下顺序执行该查询:

 1. FROM      $query = $this->createQueryBuilder('q')
 2. GROUP BY  ->groupby('userId') // GROUP BY
 3. HAVING    ->having('counter >= 3')
 4. SELECT    ->select('userId, count(userId) as counter')

如您所见,它是在使用counter定义的。

它的 SQL 怪癖。您不能使用 select inwherehaving语句中的定义。

所以正确的代码:

$query = $this->createQueryBuilder('q')
            ->select('userId, count(userId) as counter')
            ->groupby('userId')
            ->having('count(userId) >= 3')
            ->getQuery();

return $query->getResult();

请注意重复havingselect

于 2015-11-19T10:36:59.487 回答
2

我将为仍然有此类错误的人回答。

首先,您似乎已经在查询构建器对象中翻译了本机 sql 查询。更重要的是,您已将对象命名为q

$query = $this->createQueryBuilder('q');

一般来说,这意味着逻辑中的每个条件或分组等都应该针对q的字段:q.userId, q.gender, ...

因此,如果您编写了如下代码,您将避免您的错误:

$query = $this->createQueryBuilder('q')
            ->select('q.userId, count(q.userId) as counter')
            ->groupby('q.userId')
            ->having('counter >= 3')
            ->getQuery();

return $query->getResult();
于 2015-09-24T11:02:46.650 回答
1

我认为您缺少“来自”声明

于 2012-07-30T16:44:38.470 回答
0

您也可以通过 setParameter() 方法定义 HAVING 参数

 $qb->groupBy('userId');
 $qb->having('COUNT(*) = :some_count');
 $qb->setParameter('some_count', 3);
于 2015-04-27T20:08:09.543 回答
0
$query = "t, count(t.userId) as counter FROM YourBundle:Table t group by t.userId having counter >1 ";
return $this->getEntityManager()->createQuery($query)->getResult();

这应该有效。您甚至可以进行左连接或应用 where 子句。

于 2014-02-06T08:56:44.033 回答