您尝试使用主义进行的查询与great -n-per-group有关。要使用子查询,然后与主查询联接,则该问题很难用理论来处理。因此,下面是重写的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 AppBundleEntityScore a LEFT JOIN AppBundleEntityScore b WITH a.name = b.name AND a.score < b.scoreWHERe b.score IS NULLORDER BY a.score DESC
或者使用查询生成器,您可以使用 DEMO Schema
编写类似于我下面用symfony 2.8测试过的内容 ****
$DM = $this->get( 'Doctrine' )->getManager();$repo = $DM->getRepository( 'AppBundleEntityScore' );$results = $repo->createQueryBuilder( 'a' ) ->select( 'a' ) ->leftJoin( 'AppBundleEntityScore', 'b', 'WITH', 'a.name = b.name AND a.score < b.score' ) ->where( 'b.score IS NULL' ) ->orderBy( 'a.score','DESC' ) ->getQuery() ->getResult();
另一个想法是使用数据库中的查询创建视图,并在symfony中创建一个实体,将该视图名称放入表批注中,然后开始调用您的实体,它将提供查询返回的结果,但是不建议您暂时采用此方法。



