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

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

Mary-Kate Olsen
发布: 2024-11-19 18:08:03
原创
295 人浏览过

How to Retrieve the Maximum/Latest Record Per Group Using Doctrine Query Language (DQL)?

Doctrine 查询语言:检索每组的最大/最新记录

Doctrine 查询语言 (DQL) 提供了从数据库检索数据的强大功能。一项常见任务是获取数据集中每个组的最大或最新行。

将 SQL 转换为 DQL

在您的情况下,您正在努力将将以下 SQL 语句发送到 DQL:

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 等效项

要在 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, a.dateCreated DESC
登录后复制

说明

此 DQL 查询利用左连接将当前行 (a) 与具有相同名称的行 (b) 进行比较,且分数较高。如果给定名称没有得分较高的行,则 b.score 将为 NULL,用于过滤结果。

替代语法

或者,您可以使用查询构建器语法,它提供了一种直观且灵活的方式来构建查询:

$qb = $em->createQueryBuilder();
$qb->select('a')
   ->from('AppBundle:Score', 'a')
   ->leftJoin('AppBundle:Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score')
   ->where('b.score IS NULL')
   ->orderBy('a.score', 'DESC')
   ->orderBy('a.dateCreated', 'DESC');

$results = $qb->getQuery()->getResult();
登录后复制

其他注意事项

为了性能优化,请考虑创建索引在分数列以及名称和分数列的组合上。

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

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