21

我想选择所有内容 + 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

请帮忙 ;)

4

2 回答 2

30

为时已晚,但我写这个是为了记录。

您可以在 SELECT 语句中使用“as HIDDEN”来删除最终结果的字段,这样您就可以在不修改结果字段的情况下使用它进行排序或分组。

在您的示例中:

$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');
于 2015-10-26T20:44:02.483 回答
29

这是最终的工作查询

    $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();
于 2013-04-24T21:58:56.083 回答