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!