PHP每组查询,php – Doctrine查询语言获得每组最大/最新行数

本文介绍如何将SQL查询转换为Doctrine ORM中的DQL语句,解决根据名称获取最高分的问题。作者分享了SQL到DQL的转换过程,并提供了两种方法:直接使用DQL和通过查询构建器。同时探讨了使用子查询的技巧和避免使用聚合函数的解决方案。
摘要由CSDN通过智能技术生成

我正在尝试并且未能将我相对简单的SQL语句转换为可在Doctrine中工作的语句.

这是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

这是迄今为止的DQL尝试:

$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"

);

目前正在提供此错误:

[Semantical Error] line 0, col 73 near 'ShmupBundle:Score': Error: Class ShmupBundle\Entity\Score has no association named name

表本身很简单:

id,name,score,platform,dateCreated

有多个条目具有相同的名称,但分数不同.我想只显示每个名字的“高分”.我一直在尝试一两天,没有运气.谁能指出我正确的方向?

解决方法:

您尝试使用doctrine进行的查询与greatest-n-per-group相关.要使用子查询然后使用主查询进行连接,请使用doctrine处理复杂的事务.所以下面是重写的SQL版本,以便在不使用任何聚合函数的情况下获得相同的结果:

SELECT

a.*

FROM

score a

LEFT JOIN score b

ON a.name = b.name

AND a.score < b.score

WHERE b.score IS NULL

ORDER BY a.score DESC

要转换上述查询等效于doctrine或DQL很简单,下面是上面SQL的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

或者使用查询构建器,您可以使用DEMO Schema编写类似我在下面使用symfony 2.8测试的内容

$DM = $this->get( 'Doctrine' )->getManager();

$repo = $DM->getRepository( 'AppBundle\Entity\Score' );

$results = $repo->createQueryBuilder( 'a' )

->select( 'a' )

->leftJoin(

'AppBundle\Entity\Score',

'b',

'WITH',

'a.name = b.name AND a.score < b.score'

)

->where( 'b.score IS NULL' )

->orderBy( 'a.score','DESC' )

->getQuery()

->getResult();

另一个想法是在数据库中使用您的查询创建一个视图,并在symfony中创建一个实体,将视图名称放在表注释中,然后开始调用您的实体,它将给出查询返回的结果,但这种方法不建议只是临时修复.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值