Maison > base de données > tutoriel mysql > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-17 20:59:01
original
859 Les gens l'ont consulté

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
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal