2012-03-28 61 views
0
$qb = $this->createQueryBuilder('t'); 

    return $qb 
     ->join('t.customers', 'c') 
     ->where($qb->expr()->eq('t.user', $user->getId())) 
     ->andWhere($qb->expr()->gt($qb->expr()->count('c'), 0)) 
     ->orderBy('t.name')->getQuery()->getResult(); 

上面的查询使用GROUP(Doctrine2产生的一个)是给我这个错误:获得“#1111 - 无效使用组功能的”没有在MySQL

#1111 - Invalid use of group function

,但奇怪的是我” m不使用GROUP BY。任何帮助非常感谢,谢谢。

SELECT t0_.id AS id0, 
     t0_.slug AS slug1, 
     t0_.name AS name2, 
     t0_.description AS description3, 
     t0_.user_id AS user_id4 
FROM tag t0_ 
    INNER JOIN customers_tags c2_ ON t0_.id = c2_.tag_id 
     INNER JOIN customer c1_ ON c1_.id = c2_.customer_id 
WHERE t0_.user_id = 1 AND COUNT(c1_.id) > 0 
ORDER BY t0_.name ASC 

回答

7

您在where子句中使用了不允许的聚合函数count()

条件对聚合函数需要不使用进入HAVING子句

.... 
WHERE t0_.user_id = 1 
HAVING count(c1_.id) > 0 

当然,你需要使用GROUP BY得到正确的结果(虽然MySQL将可能让你得逞一个GROUP BY - 但随后的结果是不可预知)

0

“计数”不能在没有通过组数是“分组功能”

2

无需在连接和havings使用。只需使用SIZE功能:

$qb->where('SIZE(t.customers) = 0'); 

这会给你不附带客户

+0

先生,你让我一天都行。自24小时以来一直苦苦挣扎,对数组集合(数组集合中的指定项目或数组集合的大小为0)进行双重检查,这种方法完美无缺。 – YumeYume 2017-01-13 08:46:04

+0

这应该是被接受的答案:) – 2018-01-25 20:29:17