Maison >base de données >tutoriel mysql >Comment récupérer efficacement la ligne maximale par groupe dans Doctrine DQL ?

Comment récupérer efficacement la ligne maximale par groupe dans Doctrine DQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-17 20:59:01927parcourir

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

Doctrine Query Language : Récupération du maximum ou de la dernière ligne par groupe

Dans Doctrine Query Language (DQL), récupération du maximum ou de la dernière ligne par groupe Le groupe peut être obtenu à l'aide de sous-requêtes et de jointures.

Énoncé du problème :

L'instruction SQL d'origine tente de récupérer le score maximum par nom à l'aide d'une jointure interne à une sous-requête. Cependant, la traduction DQL dans la question présente une erreur de syntaxe, indiquant qu'une association nommée « nom » n'existe pas dans l'entité « Score ».

Solution :

La solution suggérée évite d'utiliser des fonctions d'agrégation et se concentre sur l'utilisation de jointures pour exclure les lignes avec un score inférieur. Cette approche garantit des requêtes efficaces et élimine le besoin de logique ou de calculs supplémentaires.

Équivalent DQL :

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

Explication :

La condition de jointure gauche garantit que seules les lignes avec le score le plus élevé par nom sont incluses dans le résultat. Les lignes avec un score inférieur seront filtrées par la clause WHERE suivante, qui vérifie l'absence d'un score plus élevé pour le même nom.

Alternative au générateur de requêtes :

Cette approche peut également être mise en œuvre à l'aide du générateur de requêtes :

$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();

Considérations supplémentaires :

Une approche alternative consiste à créer une vue de base de données qui représente les résultats de requête souhaités. . Cette vue peut ensuite être mappée à une entité dans Doctrine, offrant ainsi un moyen transparent d'accéder aux données sans avoir recours à des requêtes complexes. Cependant, cette approche est généralement déconseillée car elle peut entraîner des problèmes de performances et de maintenance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn