Problem:
Übersetzen einer SQL-Anweisung in die Doctrine Query Language (DQL), um die maximale oder neueste Zeile für jede Gruppe abzurufen.
SQL Aussage:
SELECT a.* FROM score a INNER JOIN ( SELECT name, MAX(score) AS highest FROM score GROUP BY name ) b ON a.score = b.highest AND a.name = b.name GROUP BY name ORDER BY b.highest DESC, a.dateCreated DESC
DQL-Versuch:
$kb = $em->createQuery( "SELECT a FROM ShmupBundle:Score a INNER JOIN a.name ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY b.name WHERE a.platform='keyboard' GROUP BY a.name ORDER BY b.score DESC, a.dateCreated DESC" );
Fehler:
[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name
Lösung:
Der DQL-Versuch versucht es Verwenden Sie eine Zuordnung mit dem Namen „Name“, die in der Score-Entität nicht vorhanden ist.
Umgeschriebene SQL-Anweisung:
Um die Verwendung von Aggregatfunktionen zu vermeiden, kann die SQL-Anweisung sein umgeschrieben als:
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
Äquivalent 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
Query Builder-Version:
Mit dem Query Builder kann die Abfrage wie folgt geschrieben werden:
$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();
Das obige ist der detaillierte Inhalt vonWie rufe ich die maximale oder neueste Zeile pro Gruppe in Doctrine Query Language (DQL) ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!