ホームページ >データベース >mysql チュートリアル >Doctrine Query Language (DQL) を使用してグループごとの最大行または最新行を取得するにはどうすればよいですか?

Doctrine Query Language (DQL) を使用してグループごとの最大行または最新行を取得するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-18 22:32:02434ブラウズ

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

Doctrine クエリ言語: グループごとの最大または最新の行の取得

各グループの最大または最新の行を取得するには、 Doctrine Query Language (DQL) では、サブクエリを利用してターゲット行を識別する必要があります。以下の手順は、これを実現する方法の概要を示しています:

元の SQL クエリ:

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

同等の Doctrine クエリ言語:

最初の試行:

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN a.name ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY b.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);

エラー:

[意味的エラー] 行 0、列 73 'ShmupBundle:Score' 付近: エラー: クラス ShmupBundleEntityScore には name という名前の関連付けがありません

修正バージョン:

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY a.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);

説明:

元の SQLクエリでは、サブクエリを使用して各名前の最大スコアが計算されます。次に、この結果がメイン クエリと結合されて、スコアが最も高い行が特定されます。

これを DQL に変換するには、同様のアプローチが必要です。ただし、a.name フィールドはスコア エンティティに関連付けとして存在しません (エラー メッセージで示されているように)。これを修正するには、a.score と b.score が等しいこと、および a.name と b.name が等しいという条件で、サブクエリを別個のエンティティ結合として作成します。

このアプローチの代替案ROW_NUMBER() 関数を使用するように SQL クエリを修正すると、サブクエリを使用せずに同じ結果が得られます。このメソッドに使用される DQL は、使用されている Doctrine のバージョンによって異なります。例:

use Doctrine\ORM\Query\Expr\Func;

$query = $em->createQuery(
    'SELECT a
    FROM Score AS a
    WHERE FUNC("ROW_NUMBER()", a.name) = 1
    ORDER BY a.score DESC'
);

以上がDoctrine Query Language (DQL) を使用してグループごとの最大行または最新行を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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