Подтвердить что ты не робот

Создание запроса Doctrine select MAX

Я хотел бы выбрать все значение + 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();

Как я мог достичь этого в доктрине? Я получаю сообщение об ошибке, что свойство * не найдено. Я попытался выбрать их по одному, но не повезло.

Цель состоит в том, чтобы достичь чего-то вроде этого

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

Пожалуйста, помогите;)

4b9b3361

Ответ 1

Вот окончательный рабочий запрос

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

Ответ 2

Это слишком поздно, но я пишу это для записей.

Вы можете использовать "как HIDDEN" в операторах SELECT для удаления поля конечного результата, таким образом вы можете использовать его для упорядочения или группировки без изменения полей результатов.

В вашем примере:

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