Heim  >  Artikel  >  Datenbank  >  Wie kann man mithilfe der Doctrine Query Language effizient die maximale oder neueste Zeile pro Gruppe finden?

Wie kann man mithilfe der Doctrine Query Language effizient die maximale oder neueste Zeile pro Gruppe finden?

Barbara Streisand
Barbara StreisandOriginal
2024-11-20 19:00:20852Durchsuche

How to Efficiently Find the Maximum or Latest Row Per Group Using Doctrine Query Language?

Doctrine Query Language: Finden der maximalen oder neuesten Zeilen pro Gruppe

Bei einigen Datenbankoperationen ist es notwendig, nach dem Maximum oder den neuesten Zeilen abzufragen Zeile innerhalb einer Datengruppe. Um SQL-Anweisungen, die solche Vorgänge ausführen, in Doctrine Query Language (DQL) zu übersetzen, müssen Sie bestimmte Techniken nutzen.

Eine gängige SQL-Technik besteht darin, eine Unterabfrage zu verwenden, um den höchsten oder neuesten Wert innerhalb einer Gruppe zu ermitteln und dann beizutreten die Hauptabfrage mit diesen Ergebnissen. Allerdings kann dieser Ansatz im Hinblick auf die Doktrin komplex werden.

Eine alternative Lösung besteht darin, die SQL-Anweisung neu zu schreiben, um die Verwendung von Aggregatfunktionen zu vermeiden. Um beispielsweise die höchste Punktzahl pro Name zu ermitteln, können Sie die folgende SQL-Anweisung verwenden:

SELECT 
  a.* 
FROM
  score a 
  LEFT JOIN score b 
    ON a.name = b.name 
    AND a.score < b.score 
WHERE b.score IS NULL 
ORDER BY a.score DESC 

Diese Abfrage wählt alle Zeilen aus der Bewertungstabelle aus, in denen für denselben Namen keine höhere Punktzahl aufgezeichnet wurde.

Um die SQL-Anweisung in DQL zu übersetzen, können Sie schreiben:

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

Sie können auch die Abfrage-Builder-API in Doctrine verwenden, um die Abfrage zu erstellen:

$DM   = $this->get( 'Doctrine' )->getManager();
$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();

Dies bietet eine effiziente Möglichkeit, denselben Vorgang wie die ursprüngliche SQL-Anweisung mit Doctrine auszuführen.

Das obige ist der detaillierte Inhalt vonWie kann man mithilfe der Doctrine Query Language effizient die maximale oder neueste Zeile pro Gruppe finden?. 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