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中文网其他相关文章!