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
DDDOriginal
2024-11-18 22:32:02436Durchsuche

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

Ä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!

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