ホームページ  >  記事  >  データベース  >  Doctrine DQL でグループごとの最大行を効率的に取得する方法は?

Doctrine DQL でグループごとの最大行を効率的に取得する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-17 20:59:01859ブラウズ

How to Efficiently Retrieve the Maximum Row per Group in Doctrine DQL?

Doctrine Query Language: グループごとの最大または最新の行の取得

Doctrine Query Language (DQL) では、グループごとの最大または最新の行を取得します。グループは、サブクエリと結合を使用して実現できます。

問題ステートメント:

元の SQL ステートメントは、サブクエリへの内部結合を使用して、名前ごとの最大スコアを取得しようとします。ただし、質問の DQL 変換では構文エラーが発生し、「name」という名前の関連付けが「Score」エンティティに存在しないことを示しています。

解決策:

提案された解決策は、集計関数の利用を回避し、結合を使用してスコアの低い行を除外することに重点を置いています。このアプローチにより、効率的なクエリが保証され、追加のロジックや計算が不要になります。

DQL 同等:

SELECT a 
FROM AppBundle\Entity\Score a
    LEFT JOIN AppBundle\Entity\Score b 
    WITH a.name = b.name AND a.score < b.score
WHERE b.score IS NULL
ORDER BY a.score DESC

説明:

左結合条件により、名前ごとのスコアが最も高い行のみが結果に含まれるようになります。スコアの低い行は、後続の WHERE 句によってフィルタリングされ、同じ名前でより高いスコアが存在しないことがチェックされます。

クエリ ビルダーの代替:

このアプローチは、クエリ ビルダーを使用して実装することもできます:

$repo = $DM->getRepository('AppBundle\Entity\Score');
$results = $repo->createQueryBuilder('a')
                ->select('a')
                ->leftJoin(
                    'AppBundle\Entity\Score',
                    'b',
                    'WITH',
                    'a.name = b.name AND a.score < b.score'
                )
                ->where('b.score IS NULL')
                ->orderBy('a.score', 'DESC')
                ->getQuery()
                ->getResult();

追加の考慮事項:

別のアプローチには、目的のクエリ結果を表すデータベース ビューの作成が含まれます。このビューは Doctrine のエンティティにマッピングできるため、複雑なクエリを必要とせずにデータにアクセスするシームレスな方法が提供されます。ただし、このアプローチはパフォーマンスとメンテナンスの問題を引き起こす可能性があるため、一般的に推奨されません。

以上がDoctrine DQL でグループごとの最大行を効率的に取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。