学说查询语言:检索每个组的最大或最新行
为了使用以下方法检索每个组的最大或最新行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中文网其他相关文章!