我正在尝试这样做:
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.
真的与学说挣扎。 :(
答案 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。您无法使用where
或having
语句中的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);