sql >> データベース >  >> RDS >> Mysql

Doctrineクエリ言語はグループごとの最大/最新行を取得します

    doctrineで実行しようとしているクエリは、 。サブクエリを使用してからメインクエリに参加するには、Doctrineで処理するのが複雑になります。したがって、以下は、集計関数を使用せずに同じ結果を取得するように書き直された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 
    

    デモ

    上記のクエリをdoctrineまたはDQLと同等に変換するのは簡単です。以下は、上記のSQLの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
    

    または、クエリビルダーを使用すると、 を使用して、symfony2.8で以下でテストしたようなものを書くことができます。デモスキーマ

    $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();
    

    別のアイデアは、データベースでクエリを使用してビューを作成し、symfonyでエンティティを作成してビュー名をテーブルアノテーションに配置し、エンティティの呼び出しを開始すると、クエリによって返される結果が得られますが、このアプローチは一時的な修正としてはお勧めしません。



    1. SQLServer-INSERT後の戻り値

    2. SQLiteでデータを暗号化する

    3. Oracleでパッケージ内にプロシージャを作成する方法

    4. SQL ORDER BY