ホームページ > データベース > mysql チュートリアル > Doctrine Query Language (DQL) でグループごとの最大行または最新行を取得する方法は?

Doctrine Query Language (DQL) でグループごとの最大行または最新行を取得する方法は?

Susan Sarandon
リリース: 2024-11-25 19:46:11
オリジナル
298 人が閲覧しました

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

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

問題:

SQL ステートメントを Doctrine クエリ言語に変換する(DQL) それぞれの最大行または最新行を取得します。 group.

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
ログイン後にコピー

DQL試行:

$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"
);
ログイン後にコピー

エラー:

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name
ログイン後にコピー

解決策:

DQL の試行はスコアに存在しない「名前」という名前の関連付けを使用しますentity.

書き換えられた SQL ステートメント:

集約関数の使用を回避するには、SQL ステートメントを次のように書き換えることができます:

SELECT 
  a.* 
FROM
  score a 
  LEFT JOIN score b 
    ON a.name = b.name 
    AND a.score < b.score 
WHERE b.score IS NULL 
ORDER BY a.score DESC 
ログイン後にコピー

同等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
ログイン後にコピー

クエリ ビルダーのバージョン:

クエリ ビルダーを使用すると、クエリは次のように記述できます:

$DM   = $this->get( 'Doctrine' )->getManager();
$repo = $DM->getRepository( 'AppBundle\Entity\Score' );
$results = $repo->createQueryBuilder( 'a' )
                ->select( 'a' )
                ->leftJoin(
                    'AppBundle\Entity\Score',
                    'b',
                    'WITH',
                    'a.name = b.name AND a.score < b.score'
                )
                ->where( 'b.score IS NULL' )
                ->orderBy( 'a.score','DESC' )
                ->getQuery()
                ->getResult();
ログイン後にコピー

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

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