web-dev-qa-db-fra.com

Doctrine construction de requête sélectionnez MAX

Je voudrais tout sélectionner + valeur MAX et ne recevoir que des lignes ayant des valeurs 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();

Comment pourrais-je y parvenir dans la doctrine? Je reçois une erreur indiquant que * la propriété est introuvable. J'ai essayé de les sélectionner tous un par un mais pas de chance non plus.

Le but est de réaliser quelque chose comme ça

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

S'il vous plaît aider;)

17
rat4m3n

Voici une dernière requête de travail

    $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();
20
rat4m3n

Il est trop tard, mais j'écris ceci pour les dossiers.

Vous pouvez utiliser "as HIDDEN" dans les instructions SELECT pour supprimer un champ du résultat final, de cette façon, vous pouvez l'utiliser pour classer ou regrouper sans modifier les champs de résultat.

Dans votre exemple:

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