web-dev-qa-db-ja.com

Doctrine query building 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

助けてください ;)

17
rat4m3n

これが最終的な作業クエリです

    $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

遅すぎますが、記録のためにこれを書きます。

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