sql >> Base de Datos >  >> RDS >> Mysql

El lenguaje de consulta de Doctrine obtiene la fila máxima/más reciente por grupo

La consulta que está tratando de hacer con la doctrina está relacionada con . Usar una consulta secundaria y luego unirla con la consulta principal hace que las cosas sean complicadas de manejar con la doctrina. A continuación se muestra la versión de SQL reescrita para obtener los mismos resultados sin el uso de ninguna función 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

Convertir la consulta anterior equivalente a la doctrina o DQL es fácil, a continuación se muestra la versión DQL del SQL anterior:

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

O con el generador de consultas, puede escribir algo como lo probé a continuación con Symfony 2.8 usando 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();

Otra idea sería crear una vista usando su consulta en la base de datos y en Symfony crear una entidad, poner el nombre de la vista en la anotación de la tabla y simplemente comenzar a llamar a su entidad, le dará los resultados devueltos por su consulta, pero este enfoque no se recomienda solo como una solución temporal. .