ホームページ >データベース >mysql チュートリアル >Doctrine Query Language (DQL) を使用してグループごとの最大/最新レコードを取得する方法は?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-19 18:08:03306ブラウズ

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

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