Doctrine查询构建选择MAX

22

我想选择所有内容和最大值,只接收具有最大值的行。

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

我该如何在Doctrine中实现这个?我得到了一个“property没有找到”的错误。我尝试了一个接一个地选择它们,但仍然没有运气。

目标是实现类似于这样的东西

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

请帮忙 ;)


1
DQL ≠ SQL,不确定你在这里想做什么。select(' s , ...) 应该足够了。 - mpm
这将只选择我的最高分数而不是整个实体.. 我正在尝试获取用户的所有唯一最高分数。 - rat4m3n
1
就像 @mpm 建议的那样,只需执行 select('s, MAX(s.score)')。 - james_t
这似乎运行良好(稍微有点问题),谢谢大家,但我收到的是数组中的数组(对象、最大值),但意图是仅接收对象... - rat4m3n
这还不对...“我想选择所有内容+最大值,并仅接收具有最大值的行。”即使我可以提取最高分和对象...但对象是“随机”的,而不是得分最高的对象...所以似乎我需要使用distinct,但distinct对我来说似乎不起作用。 - rat4m3n
2个回答

33

虽然时机已经晚了,但我写下这些内容作为记录。

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

30

这里是最终可用的查询

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

1
请标记它为答案,还有$limit是从哪里获取的? - Braian Mellor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接