Heim >Datenbank >MySQL-Tutorial >Wie rufe ich die maximale oder neueste Zeile pro Gruppe mithilfe der Doctrine Query Language (DQL) ab?
Doctrine Query Language: Abrufen der maximalen oder neuesten Zeile pro Gruppe
Um die maximale oder neueste Zeile für jede Gruppe mithilfe von abzurufen In der Doctrine Query Language (DQL) ist es notwendig, Unterabfragen zu nutzen, um die Zielzeilen zu identifizieren. Die folgenden Schritte beschreiben, wie Sie dies erreichen:
Ursprüngliche SQL-Abfrage:
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
Äquivalent zur Doctrine Query Language:
Erster 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:
[Semantischer Fehler] Zeile 0, Spalte 73 in der Nähe von „ShmupBundle:Score“: Fehler : Klasse ShmupBundleEntityScore hat keine Assoziation namens name
Korrigierte Version:
$kb = $em->createQuery( "SELECT a FROM ShmupBundle:Score a INNER JOIN ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY a.name WHERE a.platform='keyboard' GROUP BY a.name ORDER BY b.score DESC, a.dateCreated DESC" );
Erklärung:
Im Original-SQL Bei der Abfrage wird eine Unterabfrage verwendet, um die maximale Punktzahl für jeden Namen zu berechnen. Dieses Ergebnis wird dann mit der Hauptabfrage verknüpft, um die Zeilen mit den höchsten Punktzahlen zu identifizieren.
Um dies in DQL zu übersetzen, ist ein ähnlicher Ansatz erforderlich. Das Feld a.name ist jedoch nicht als Zuordnung in der Score-Entität vorhanden (wie in der Fehlermeldung angegeben). Um dies zu beheben, wird die Unterabfrage als separater Entity-Join geschrieben, mit der Bedingung, dass a.score und b.score gleich sind und dass a.name und b.name gleich sind.
Eine Alternative zu diesem Ansatz besteht darin, die SQL-Abfrage zu überarbeiten, um die Funktion ROW_NUMBER() zu verwenden, die die gleichen Ergebnisse liefern kann, ohne dass eine Unterabfrage erforderlich ist. Der für diese Methode verwendete DQL hängt von der verwendeten Doctrine-Version ab. Zum Beispiel:
use Doctrine\ORM\Query\Expr\Func; $query = $em->createQuery( 'SELECT a FROM Score AS a WHERE FUNC("ROW_NUMBER()", a.name) = 1 ORDER BY a.score DESC' );
Das obige ist der detaillierte Inhalt vonWie rufe ich die maximale oder neueste Zeile pro Gruppe mithilfe der Doctrine Query Language (DQL) ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!