Maison > base de données > tutoriel mysql > 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
Libérer: 2024-11-20 19:00:20
original
912 Les gens l'ont consulté

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

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

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

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!

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