2012-04-08 25 views
4

Ich versuche, dies zu tun:Lehre: GROUP BY HAVING

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

In Lehre mit den Querybuilder, habe ich dies bekommt:

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

     return $query->getResult(); 

Was mir diesen Fehler gibt:

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

Wirklich mit der Doktrin zu kämpfen. :(

+1

ich denke, es beschwert sich, dass 'count (*)' ist nicht 'count (UserId)' –

+0

'count (*) 'ist kein Bezeichner. Sie sollten Ihren Alias ​​'counter' verwenden. – naitsirch

Antwort

2

Ich glaube, Sie fehlt das ‚von‘ Aussage

+0

'createQueryBuilder', aufgerufen in einem Repository, benötigt keine Root-Entity-Deklaration (aka FROM). Die Root-Entität ist die verbundene Entität des Repositorys. – dom

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(); 

Dies sollte funktionieren. Sie selbst tun können, links beitritt oder Anwendung, wenn clausules.

0

Sie definieren können Parameter über setParameter MIT () Verfahren sowie

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

ich für Leute, die immer noch diese Art von Fehler haben.

beantworten werde

Zunächst einmal scheinen Sie eine native SQL-Abfrage in ein Query Builder-Objekt übersetzt zu haben. Um so mehr, haben Sie Ihr Objekt als q genannt

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

Was bedeutet dies in der Regel ist, dass jede Bedingung oder Gruppierung usw. Sie in Ihrer Logik Felder q Adresse sollte: q.userId, q.gender, ...

Also, wenn Sie Ihren Code wie unten geschrieben hatte, würden Sie Ihren Fehler vermieden haben:

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

return $query->getResult(); 
4

Ihre SQL ist gültig, Ihre Query Builder-Anweisung ist ungültig

Alle Ursachen db diese Abfrage in folgenden Reihenfolge ausgeführt wird:

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') 

So wie Sie sehen können counternach seine Verwendung in mit definiert ist.

Seine SQL Quirk. Sie können nicht Definitionen von wählen in where oder having Aussagen.

So richtigen Code:

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

return $query->getResult(); 

Wiederholung in having beachten Sie von select