Heim > Datenbank > MySQL-Tutorial > Hauptteil

Wie kann ich die maximale Zeile pro Gruppe in Doctrine DQL effizient abrufen?

Mary-Kate Olsen
Freigeben: 2024-11-17 20:59:01
Original
859 Leute haben es durchsucht

How to Efficiently Retrieve the Maximum Row per Group in Doctrine DQL?

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

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

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!

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