2013-04-24 13 views
13

Chciałbym wybrać wszystko + wartość MAX i otrzymywać tylko wiersze o wartościach maksymalnych.Doctrine query building select 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(); 

Jak mogę to osiągnąć w doktrynie? Otrzymuję komunikat o błędzie, że nie znaleziono właściwości *. Starałem się wybierać je wszystkie jeden po drugim, ale bez powodzenia.

celem jest osiągnięcie coś takiego

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

proszę o pomoc;)

+1

DQL =/= SQL, nie wiem, co chce zrobić tutaj. select ('s, ...) powinno wystarczyć. – mpm

+0

To wybierze mi tylko max_score, a nie mój cały podmiot .. Próbuję uzyskać wszystkie unikalne najwyższe wyniki dla użytkowników. – rat4m3n

+1

Po prostu wybierz opcję ('s, MAX (s.score)'), tak jak sugerował @mpm. –

Odpowiedz

18

Oto ostateczna zapytania roboczego

$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

Proszę oznaczyć je jako odpowiedź, także gdzie dostaniesz limit $? –

12

Jest zbyt późno, ale piszę to dla rekordów .

Możesz używać "as HIDDEN" w instrukcjach SELECT, aby usunąć pole wyniku końcowego, w ten sposób możesz go użyć do zamawiania lub grupowania bez modyfikowania pól wyników.

W przykładzie:

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