Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Doctrine Query Language erhält die maximale/neueste Zeile pro Gruppe

Die Abfrage, die Sie mit Lehre zu machen versuchen, bezieht sich auf . Wenn Sie eine Unterabfrage verwenden und sich dann mit der Hauptabfrage verbinden, wird die Handhabung der Doktrin kompliziert. Unten ist also die umgeschriebene SQL-Version, um die gleichen Ergebnisse ohne Verwendung von Aggregatfunktionen zu erhalten:

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

Die obige Abfrage äquivalent zu Doktrin oder DQL zu konvertieren ist einfach, unten ist die DQL-Version von obigem SQL:

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

Oder mit dem Query Builder können Sie etwas schreiben, wie ich es unten mit Symfony 2.8 getestet habe, indem Sie verwenden DEMO-Schema

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

Eine andere Idee wäre, eine Ansicht mit Ihrer Abfrage in der Datenbank zu erstellen und in Symfony eine Entität zu erstellen, den Ansichtsnamen in die Tabellenanmerkung einzufügen und einfach mit dem Aufrufen Ihrer Entität zu beginnen, es wird die von Ihrer Abfrage zurückgegebenen Ergebnisse liefern, aber dieser Ansatz wird nicht nur als vorübergehende Lösung empfohlen .