Heim >Datenbank >MySQL-Tutorial >Wie rufe ich die maximale oder neueste Zeile pro Gruppe in Doctrine Query Language (DQL) ab?

Wie rufe ich die maximale oder neueste Zeile pro Gruppe in Doctrine Query Language (DQL) ab?

Susan Sarandon
Susan SarandonOriginal
2024-11-25 19:46:11316Durchsuche

How to Retrieve the Maximum or Latest Row per Group in Doctrine Query Language (DQL)?

Doctrine Query Language: Maximale oder neueste Zeile pro Gruppe

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn