Heim  >  Artikel  >  Datenbank  >  Wie rufe ich den maximalen/letzten Datensatz pro Gruppe mithilfe der Doctrine Query Language (DQL) ab?

Wie rufe ich den maximalen/letzten Datensatz pro Gruppe mithilfe der Doctrine Query Language (DQL) ab?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-19 18:08:03258Durchsuche

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

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!

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