Maison  >  Article  >  base de données  >  Comment trouver efficacement la ligne maximale ou la dernière par groupe à l'aide du langage de requête Doctrine ?

Comment trouver efficacement la ligne maximale ou la dernière par groupe à l'aide du langage de requête Doctrine ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-20 19:00:20852parcourir

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

Langage de requête de doctrine : recherche du nombre maximum ou des dernières lignes par groupe

Dans certaines opérations de base de données, il est nécessaire d'interroger le nombre maximum ou le plus récent ligne au sein d’un groupe de données. Pour traduire les instructions SQL qui effectuent de telles opérations en Doctrine Query Language (DQL), vous devez exploiter des techniques spécifiques.

Une technique SQL courante consiste à utiliser une sous-requête pour déterminer la valeur la plus élevée ou la plus récente au sein d'un groupe, puis à la rejoindre. la requête principale avec ces résultats. Cependant, cette approche peut devenir complexe lorsqu'il s'agit de Doctrine.

Une solution alternative consiste à réécrire l'instruction SQL pour éviter d'utiliser des fonctions d'agrégation. Par exemple, pour trouver le score le plus élevé par nom, vous pouvez utiliser l'instruction SQL suivante :

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 

Cette requête sélectionne toutes les lignes de la table de scores où aucun score plus élevé n'est enregistré pour le même nom.

Pour traduire l'instruction SQL en DQL, vous pouvez écrire :

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

Vous pouvez également utiliser l'API du générateur de requêtes dans Doctrine pour construire la requête :

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

Cela fournit un moyen efficace d'effectuer la même opération que l'instruction SQL d'origine à l'aide de Doctrine.

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