使用 Symfony Doctrine 从 2 个表中查询平均值
Querying average value from 2 tables with Symfony Doctrine
我正在使用 Symfony 2.6 和 Doctrine 作为 ORM。该项目在 Apache + MySQL.
上 运行
我的数据库中有 2 个实体:图书和评级。我正在构建一个系统,用户可以在其中对书籍进行评分,评分范围为 0 到 100。
我的实体:
- 图书:id,其他无关字段
- 评分:id,book_id,评分,其他无关字段
每本书可以有多个评分,但一个评分只能与一本书相关(一对多映射)。
我的目标是获得按平均评分排序的前 5 本书。
示例:
- 第 1 册:94.5
- 第 2 册:93.3
- 第 3 册:89.2
- 第 4 册:85.2
- 第 5 册:79.6
我已经尝试使用两个实体的双 for 循环来获得结果,但根据 Symfony 分析器,它花费了 3.7 秒并需要 1001 次查询,这是非常低效的。我非常确定可以使用 DQL 以更好的方式完成它,所以...
实现我的目标的最有效方法是什么(如果可能,在单个查询中)?
编辑
感谢 MikO 在正确的方向上的推动。需要在 FROM 和 JOIN 语句中写入完整的实体(如 AcmeBundle:Book)才能正常工作。此外,您不能在查询构建器中使用 LIMIT,因此在构建查询之后和调用结果之前,我不得不使用 setMaxResults(5) 以便仅检索前 5 本书。
我还没有真正尝试过这个,但是我会为你的 Book
实体创建一个 custom repository class,然后我会在里面写这样的东西:
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;
}
我正在使用 Symfony 2.6 和 Doctrine 作为 ORM。该项目在 Apache + MySQL.
上 运行我的数据库中有 2 个实体:图书和评级。我正在构建一个系统,用户可以在其中对书籍进行评分,评分范围为 0 到 100。
我的实体:
- 图书:id,其他无关字段
- 评分:id,book_id,评分,其他无关字段
每本书可以有多个评分,但一个评分只能与一本书相关(一对多映射)。
我的目标是获得按平均评分排序的前 5 本书。
示例:
- 第 1 册:94.5
- 第 2 册:93.3
- 第 3 册:89.2
- 第 4 册:85.2
- 第 5 册:79.6
我已经尝试使用两个实体的双 for 循环来获得结果,但根据 Symfony 分析器,它花费了 3.7 秒并需要 1001 次查询,这是非常低效的。我非常确定可以使用 DQL 以更好的方式完成它,所以...
实现我的目标的最有效方法是什么(如果可能,在单个查询中)?
编辑
感谢 MikO 在正确的方向上的推动。需要在 FROM 和 JOIN 语句中写入完整的实体(如 AcmeBundle:Book)才能正常工作。此外,您不能在查询构建器中使用 LIMIT,因此在构建查询之后和调用结果之前,我不得不使用 setMaxResults(5) 以便仅检索前 5 本书。
我还没有真正尝试过这个,但是我会为你的 Book
实体创建一个 custom repository class,然后我会在里面写这样的东西:
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;
}