Heim > Datenbank > MySQL-Tutorial > Hauptteil

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

Susan Sarandon
Freigeben: 2024-11-25 19:46:11
Original
241 Leute haben es durchsucht

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
Nach dem Login kopieren

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"
);
Nach dem Login kopieren

Fehler:

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name
Nach dem Login kopieren

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 
Nach dem Login kopieren

Ä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
Nach dem Login kopieren

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();
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage