学说:GROUP BY HAVING

时间:2012-04-08 07:23:36

标签: doctrine

我正在尝试这样做:

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

在使用querybuilder的学说中,我得到了这个:

$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.

真的与学说挣扎。 :(

5 个答案:

答案 0 :(得分:6)

您的SQL 有效,您的查询构建器语句无效

所有原因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 Quirk。您无法使用wherehaving语句中的select中的定义。

如此正确的代码:

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

return $query->getResult();

请从having

select注意重复

答案 1 :(得分:1)

我认为你错过了'from'陈述

答案 2 :(得分:1)

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

首先,您似乎已在查询构建器对象中翻译了本机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();

答案 3 :(得分: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();

这应该有效。你甚至可以做左连接或应用于clausules。

答案 4 :(得分:0)

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

 $qb->groupBy('userId');
 $qb->having('COUNT(*) = :some_count');
 $qb->setParameter('some_count', 3);