我正在尝试并且未能将我相对简单的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,名称,分数,平台,日期
有多个名称相同但得分不同的条目。我只想显示每个名称的“高分”。我已经尝试了一两天了,没有运气。谁能指出我正确的方向?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您正在尝试使用原则进行的查询与 每组最多。要使用子查询,然后与主查询联接,则该问题很难用理论来处理。因此,下面是重写的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 演示
要将上面的查询转换为等同于主义或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中创建一个实体,将该视图名称放入表批注中,然后开始调用您的实体,它将提供查询返回的结果,但是不建议您暂时采用此方法。来源:stack overflow