Mysql
 sql >> Database >  >> RDS >> Mysql

Doctrine Query Language ottiene la riga massima/ultima per gruppo

La query che stai cercando di fare con la dottrina è correlata a . Per utilizzare una query secondaria e quindi unirti alla query principale, è complicato gestire le cose con la dottrina. Quindi di seguito è riportata la versione SQL riscritta per ottenere gli stessi risultati senza l'uso di alcuna funzione di aggregazione:

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 

DEMO

Per convertire la query sopra equivalente a dottrina o DQL è facile, di seguito è riportata la versione DQL di SQL sopra:

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

Oppure con il generatore di query puoi scrivere qualcosa come ho testato di seguito con symfony 2.8 usando Schema DEMO

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

Un'altra idea sarebbe creare una vista usando la tua query nel database e in symfony creare un'entità metti il ​​nome della vista nell'annotazione della tabella e inizia semplicemente a chiamare la tua entità darà i risultati restituiti dalla tua query ma questo approccio non è raccomandato solo una correzione temporanea .