如何高效检索 Doctrine DQL 中每组的最大行数?

Mary-Kate Olsen
发布: 2024-11-17 20:59:01
原创
859 人浏览过

How to Efficiently Retrieve the Maximum Row per Group in Doctrine DQL?

Doctrine Query Language:检索每个组的最大或最新行

在 Doctrine Query Language (DQL) 中,检索每个组的最大或最新行可以使用子查询和联接来实现分组。

问题陈述:

原始 SQL 语句尝试使用子查询的内部联接来检索每个名称的最大分数。但是,问题中的 DQL 翻译出现语法错误,表明“Score”实体中不存在名为“name”的关联。

解决方案:

建议的解决方案避免使用聚合函数,并侧重于使用联接来排除得分较低的行。这种方法可确保高效查询并消除额外逻辑或计算的需要。

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

解释:

左连接条件确保结果中只包含每个名称得分最高的行。分数较低的行将被后续 WHERE 子句过滤掉,该子句会检查同名是否存在较高分数。

查询生成器替代方案:

此方法也可以使用查询生成器来实现:

$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 中的实体,从而提供一种无缝的方式来访问数据,而无需复杂的查询。然而,这种方法通常不被鼓励,因为它可能会导致性能和维护问题。

以上是如何高效检索 Doctrine DQL 中每组的最大行数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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