Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Doctrine Query Language obtém a linha máxima/última por grupo


A consulta que você está tentando fazer com a doutrina está relacionada a . Para usar uma subconsulta e, em seguida, juntar-se à consulta principal, as coisas ficam complicadas de lidar com a doutrina. Então, abaixo está a versão SQL reescrita para obter os mesmos resultados sem o uso de nenhuma função agregada:
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

Para converter a consulta acima equivalente em doutrina ou DQL é fácil, abaixo está a versão DQL do SQL acima:
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

Ou com o construtor de consultas você pode escrever algo como eu testei abaixo com o symfony 2.8 usando o Esquema 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();

Outra ideia seria criar uma view usando sua consulta no banco de dados e no symfony criar uma entidade colocar o nome da view na anotação da tabela e apenas começar a chamar sua entidade ela dará os resultados retornados pela sua consulta mas esta abordagem não é recomendada apenas uma correção temporária .