php – Doctrine查询语言获得每组最大/最新行数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – Doctrine查询语言获得每组最大/最新行数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2025字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试并且未能将我相对简单的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中创建一个实体,将视图名称放在表注释中,然后开始调用您的实体,它将给出查询返回的结果,但这种方法不建议只是临时修复.
内容总结
以上是互联网集市为您收集整理的php – Doctrine查询语言获得每组最大/最新行数全部内容,希望文章能够帮你解决php – Doctrine查询语言获得每组最大/最新行数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。