Maison > base de données > tutoriel mysql > Comment récupérer la ligne maximale ou la dernière par groupe dans Doctrine Query Language (DQL) ?

Comment récupérer la ligne maximale ou la dernière par groupe dans Doctrine Query Language (DQL) ?

Susan Sarandon
Libérer: 2024-11-25 19:46:11
original
334 Les gens l'ont consulté

How to Retrieve the Maximum or Latest Row per Group in Doctrine Query Language (DQL)?

Langage de requête Doctrine : ligne maximale ou dernière ligne par groupe

Problème :

Traduction d'une instruction SQL en langage de requête Doctrine (DQL) pour récupérer la ligne maximale ou la dernière pour chaque groupe.

SQL Déclaration :

SELECT a.*
FROM score a
INNER JOIN (
  SELECT name, MAX(score) AS highest
  FROM score
  GROUP BY name
) b
ON a.score = b.highest AND a.name = b.name
GROUP BY name
ORDER BY b.highest DESC, a.dateCreated DESC
Copier après la connexion

Tentative DQL :

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN a.name ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY b.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);
Copier après la connexion

Erreur :

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name
Copier après la connexion

Solution :

La tentative DQL tente de utilisez une association nommée « nom », qui n'existe pas dans l'entité Score.

Instruction SQL réécrite :

Pour éviter d'utiliser des fonctions d'agrégation, l'instruction SQL peut être réécrit comme :

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

É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

Version du générateur de requêtes :

À l'aide du générateur de requêtes, la requête peut être écrite comme :

$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

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 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