ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。