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