Doctrine Query Language: Maximale oder neueste Zeile pro Gruppe abrufen
In Doctrine Query Language (DQL) wird die maximale oder neueste Zeile pro Gruppe abgerufen Gruppe kann mithilfe von Unterabfragen und Verknüpfungen erreicht werden.
Problem Anweisung:
Die ursprüngliche SQL-Anweisung versucht, die maximale Punktzahl pro Name mithilfe eines inneren Joins zu einer Unterabfrage abzurufen. Die DQL-Übersetzung in der Frage weist jedoch einen Syntaxfehler auf, der darauf hinweist, dass in der Entität „Score“ keine Zuordnung mit dem Namen „Name“ vorhanden ist.
Lösung:
Die vorgeschlagene Lösung vermeidet die Verwendung von Aggregatfunktionen und konzentriert sich auf die Verwendung von Verknüpfungen, um Zeilen mit niedrigerer Bewertung auszuschließen. Dieser Ansatz gewährleistet eine effiziente Abfrage und macht zusätzliche Logik oder Berechnungen überflüssig.
DQL-Äquivalent:
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
Erklärung:
Die Left-Join-Bedingung stellt sicher, dass nur Zeilen mit der höchsten Punktzahl pro Name in das Ergebnis einbezogen werden. Zeilen mit einer niedrigeren Punktzahl werden durch die nachfolgende WHERE-Klausel herausgefiltert, die prüft, ob für denselben Namen eine höhere Punktzahl vorhanden ist.
Alternative zum Abfrage-Generator:
Dieser Ansatz kann auch mit dem Query Builder umgesetzt werden:
$repo = $DM->getRepository('AppBundle\Entity\Score'); $results = $repo->createQueryBuilder('a') ->select('a') ->leftJoin( 'AppBundle\Entity\Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score' ) ->where('b.score IS NULL') ->orderBy('a.score', 'DESC') ->getQuery() ->getResult();
Zusätzlich Überlegungen:
Ein alternativer Ansatz besteht darin, eine Datenbankansicht zu erstellen, die die gewünschten Abfrageergebnisse darstellt. Diese Ansicht kann dann einer Entität in Doctrine zugeordnet werden und bietet so einen nahtlosen Zugriff auf die Daten, ohne dass komplexe Abfragen erforderlich sind. Von diesem Ansatz wird jedoch im Allgemeinen abgeraten, da er zu Leistungs- und Wartungsproblemen führen kann.
Das obige ist der detaillierte Inhalt vonWie kann ich die maximale Zeile pro Gruppe in Doctrine DQL effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!