首先,如果我的英语不太好,请原谅。
我正在使用Symfony 2.6和Doctrine作为ORM。该项目在Apache + MySQL上运行。
我的数据库中有2个实体:书籍和评级。我正在构建一个系统,用户可以将书籍从0到100评级。
我的实体:
每本书都可以有很多评分,但评分只能与一本书相关(一对多映射)。
我的目标是按照评分的平均分数排序前5本书。
示例:
我已经尝试使用带有两个实体的双for循环来获得结果,但是根据Symfony分析器,它需要3.7秒并且需要1001个查询,这是非常低效的。我非常确定可以使用DQL以更好的方式完成,所以......
¿这可能是实现目标的最有效方式(如果可能,只需一次查询)?
提前致谢。
修改
感谢MikO推动正确的方向。需要在FROM和JOIN语句中编写完整的实体(如AcmeBundle:Book)才能工作。此外,您不能在查询构建器中使用LIMIT,因此在构建查询之后和调用结果之前,我必须使用setMaxResults(5)才能仅检索前5本书。
非常感谢。
答案 0 :(得分:0)
我还没有尝试过这个,但是我为你的Book
实体创建了一个custom repository class,然后我会在其中写下这样的内容:< / p>
public function getTopRatedBooks()
{
$em = $this->getEntityManager();
$query = $em->createQuery('
SELECT book.id, book.name, AVG(rating.score) as avg_rating
FROM book
JOIN rating
WHERE book.id = rating.book_id
GROUP BY book.id
ORDER BY avg_rating DESC
');
$result = $query->getResult();
return $result;
}