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

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

DDD
Freigeben: 2024-11-18 22:32:02
Original
482 Leute haben es durchsucht

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

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

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage