Doctrine Query Language: Maximalen/letzten Datensatz pro Gruppe abrufen
Doctrine Query Language (DQL) bietet leistungsstarke Funktionen zum Abrufen von Daten aus Datenbanken. Eine häufige Aufgabe besteht darin, die maximale oder neueste Zeile für jede Gruppe in einem Datensatz zu ermitteln.
SQL in DQL übersetzen
In Ihrem Fall haben Sie Schwierigkeiten, das zu übersetzen Folgende SQL-Anweisung an DQL:
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
Diese Abfrage zielt darauf ab, die höchste Punktzahl für jeden Namen zusammen mit anderen Spalten zu finden und die Ergebnisse nach Punktzahl zu ordnen und dann nach Erstellungsdatum.
DQL-Äquivalent
Um die gleiche Funktionalität in DQL zu erreichen, können Sie die folgende Abfrage verwenden:
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, a.dateCreated DESC
Erklärung
Diese DQL-Abfrage verwendet einen Left-Join, um die aktuelle Zeile (a) zu vergleichen. mit Zeilen mit demselben Namen (b) mit höheren Werten. Wenn es für einen bestimmten Namen keine Zeile mit einer höheren Punktzahl gibt, ist b.score NULL, was zum Filtern der Ergebnisse verwendet wird.
Alternative Syntax
Alternativ: Sie können die Abfrage-Builder-Syntax verwenden, die eine intuitive und flexible Möglichkeit zum Erstellen bietet Abfragen:
$qb = $em->createQueryBuilder(); $qb->select('a') ->from('AppBundle:Score', 'a') ->leftJoin('AppBundle:Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score') ->where('b.score IS NULL') ->orderBy('a.score', 'DESC') ->orderBy('a.dateCreated', 'DESC'); $results = $qb->getQuery()->getResult();
Zusätzliche Überlegungen
Zur Leistungsoptimierung sollten Sie erwägen, einen Index für die Bewertungsspalte und für die Kombination aus Namens- und Bewertungsspalten zu erstellen.
Das obige ist der detaillierte Inhalt vonWie rufe ich den maximalen/letzten Datensatz pro Gruppe mithilfe der Doctrine Query Language (DQL) ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!