Doctrine Query Language: グループごとの最大/最新レコードの取得
Doctrine Query Language (DQL) は、データベースからデータを取得するための強力な機能を提供します。一般的なタスクの 1 つは、データセット内の各グループの最大行または最新行を取得することです。
SQL から DQL への変換
あなたの場合、次の SQL ステートメントを DQL に送信します:
SELECT a.* FROM score a INNER JOIN ( SELECT name, MAX(score) AS highest FROM score GROUP BY name ) b ON a.score = b.highest AND a.name = b.name GROUP BY name ORDER BY b.highest DESC, a.dateCreated DESC
このクエリは、他の列とともに各名前の最高スコアを検索し、結果をスコア順、次に作成日順に並べることを目的としています。
同等の DQL
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, a.dateCreated DESC
説明
この DQL クエリは、左結合を利用して、現在の行 (a) と同じ名前を持つ行 (b) をより高いスコアと比較します。指定された名前に対してより高いスコアを持つ行がない場合、 b.score は NULL になり、結果をフィルターするために使用されます。
代替構文
または、クエリ ビルダー構文を使用すると、直感的かつ柔軟なクエリ構築方法が提供されます。
$qb = $em->createQueryBuilder(); $qb->select('a') ->from('AppBundle:Score', 'a') ->leftJoin('AppBundle:Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score') ->where('b.score IS NULL') ->orderBy('a.score', 'DESC') ->orderBy('a.dateCreated', 'DESC'); $results = $qb->getQuery()->getResult();
その他の考慮事項
パフォーマンスを最適化するには、インデックスの作成を検討してください。スコア列、および名前とスコア列の組み合わせ。
以上がDoctrine Query Language (DQL) を使用してグループごとの最大/最新レコードを取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。