首页 > 数据库 > mysql教程 > 如何使用 Doctrine 查询语言 (DQL) 检索每组的最大或最新行?

如何使用 Doctrine 查询语言 (DQL) 检索每组的最大或最新行?

Susan Sarandon
发布: 2024-11-25 19:46:11
原创
295 人浏览过

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

学说查询语言:每组的最大或最新行

问题:

将 SQL 语句转换为学说查询语言(DQL) 检索每个的最大或最新行组。

SQL 语句:

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
登录后复制

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"
);
登录后复制

错误:

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name
登录后复制

解决方案:

DQL 尝试尝试使用名为“name”的关联,该关联在分数中不存在

重写的 SQL 语句:

为了避免使用聚合函数,SQL 语句可以重写为:

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 
登录后复制

等效 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
登录后复制

查询构建器版本:

使用查询构建器,查询可以编写为:

$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();
登录后复制

以上是如何使用 Doctrine 查询语言 (DQL) 检索每组的最大或最新行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板