微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在尝试并且未能将我相对简单的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进行的查询相关.要使用子查询然后使用主查询进行连接,请使用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 

DEMO

要转换上述查询等效于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中创建一个实体,将视图名称放在表注释中,然后开始调用您的实体,它将给出查询返回的结果,但这种方法不建议只是临时修复.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐