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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-19 18:08:03322浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn