我正在尝试将相对简单的 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、名称、分数、平台、创建日期
有多个条目具有相同的名称,但分数不同。我只想显示每个名字的“高分”。我已经试穿了一两天了,但没有成功。有人能指出我正确的方向吗?
您尝试对学说执行的查询与每组最大n个。使用子查询然后与主查询连接会使处理原则变得复杂。因此,下面是重写的 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
将上述查询转换为等同于原则或 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
或者使用查询生成器,您可以使用 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 中创建一个实体,将视图名称放入表注释中,然后开始调用您的实体,它将给出查询返回的结果,但不建议使用这种方法,只是临时修复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)