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

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

DDD
发布: 2024-11-18 22:32:02
原创
468 人浏览过

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

学说查询语言:检索每个组的最大或最新行

为了使用以下方法检索每个组的最大或最新行Doctrine Query Language (DQL),需要利用子查询来识别目标行。以下步骤概述了如何实现此目的:

原始 SQL 查询:

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

等效的 Doctrine 查询语言:

第一次尝试:

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN a.name ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY b.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);
登录后复制

错误:

[语义错误]第 0 行,第 73 列“ShmupBundle:Score”附近:错误:类 ShmupBundleEntityScore 没有名为 name 的关联

更正版本:

$kb = $em->createQuery(
    "SELECT a 
    FROM ShmupBundle:Score a
    INNER JOIN ShmupBundle:Score b WITH a.score = b.score AND a.name = b.name GROUP BY a.name
    WHERE a.platform='keyboard'
    GROUP BY a.name
    ORDER BY b.score DESC, a.dateCreated DESC"
);
登录后复制

说明:

在原始 SQL 中查询中,子查询用于计算每个名称的最大分数。然后将此结果与主查询结合起来,以识别得分最高的行。

要将其转换为 DQL,需要类似的方法。但是,a.name 字段不作为 Score 实体中的关联存在(如错误消息所示)。为了解决这个问题,子查询被编写为单独的实体连接,条件是 a.score 和 b.score 相等,并且 a.name 和 b.name 相等。

此方法的替代方案的方法是修改 SQL 查询以使用 ROW_NUMBER() 函数,该函数可以提供相同的结果而不需要子查询。此方法使用的 DQL 取决于所使用的 Doctrine 版本。例如:

use Doctrine\ORM\Query\Expr\Func;

$query = $em->createQuery(
    'SELECT a
    FROM Score AS a
    WHERE FUNC("ROW_NUMBER()", a.name) = 1
    ORDER BY a.score DESC'
);
登录后复制

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

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