Doctrine Query Language (DQL) を使用してグループごとの最大/最新レコードを取得する方法は?

Mary-Kate Olsen
リリース: 2024-11-19 18:08:03
オリジナル
247 人が閲覧しました

How to Retrieve the Maximum/Latest Record Per Group Using Doctrine Query Language (DQL)?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート