我正在尝试并且未能将我相对简单的sql语句转换为可在Doctrine中工作的语句.
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中创建一个实体,将视图名称放在表注释中,然后开始调用您的实体,它将给出查询返回的结果,但这种方法不建议只是临时修复.