2013-04-24 20 views
13

Vorrei selezionare tutto + valore MAX e ricevere solo righe con valori massimi.Doctrine query building selezionare MAX

$query = $this->createQueryBuilder('s'); 
    $query->where('s.challenge = :challenge')->setParameter('challenge', $challenge); 
    $query->groupBy('s.score'); 
    $query->getQuery(); 

    return $query->select('s.*, MAX(s.score) AS max_score')->getQuery()->getResult(); 

Come potrei ottenere questo in dottrina? Sto ottenendo un errore che * la proprietà non è stata trovata. Ho provato a selezionarli tutti uno per uno, ma senza fortuna.

obiettivo è quello di raggiungere qualcosa di simile

SELECT user, challenge, whateverelse, MAX(score) FROM users_scores_table GROUP BY user_id 

Aiutaci;)

+1

DQL =/= SQL, non so cosa si sta cercando di fare qui. selezionare ('s, ...) dovrebbe essere sufficiente. – mpm

+0

Questo mi selezionerà solo max_score e non la mia intera entità .. Sto cercando di ottenere tutti i punteggi più alti unici per gli utenti. – rat4m3n

+1

Basta selezionare ('s, MAX (s.score)') come suggerito da @mpm. –

risposta

18

Ecco una domanda di lavoro finale

$query = $this->createQueryBuilder('s'); 
    $query->select('s, MAX(s.score) AS max_score'); 
    $query->where('s.challenge = :challenge')->setParameter('challenge', $challenge); 
    $query->groupBy('s.user'); 
    $query->setMaxResults($limit); 
    $query->orderBy('max_score', 'DESC'); 

    return $query->getQuery()->getResult(); 
+0

Per favore contrassegna come una risposta, anche dove prendi $ limit? –

12

E 'troppo tardi, ma Scrivo questo per i record .

È possibile utilizzare "come NASCOSTO" nelle istruzioni SELECT per rimuovere un campo del risultato finale, in questo modo è possibile utilizzarlo per ordinare o raggruppare senza modificare i campi dei risultati.

Nel tuo esempio:

$query = $this->createQueryBuilder('s'); 
$query->select('s, MAX(s.score) AS HIDDEN max_score'); 
$query->where('s.challenge = :challenge')->setParameter('challenge', $challenge); 
$query->groupBy('s.user'); 
$query->setMaxResults($limit); 
$query->orderBy('max_score', 'DESC');