DaV*_*iDa 0 mysql sql orm symfony doctrine-orm
我正在尝试获取最新预订的课程(唯一)。我已经尝试使用 Doctrine 查询构建器进行以下操作:
$repository = $this->getDoctrine()->getRepository('AppBundle:Booking');
$query = $repository->createQueryBuilder('b')
->select('(b.course) AS course')
->orderBy('b.id', 'DESC')
->groupBy('b.course')
->setMaxResults(5)
->getQuery();
Run Code Online (Sandbox Code Playgroud)
没有 orderby 它可以工作,但它将遍历预订升序。我需要最新预订的课程。通过此查询,我收到此错误:
SQLSTATE[42000]:语法错误或访问冲突:1055 ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列......它在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 500 Internal Server Error - DriverException 不兼容
我还尝试了以下方法:
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT DISTINCT c.id
FROM AppBundle:Booking b
JOIN b.course c
ORDER BY b.id DESC'
);
Run Code Online (Sandbox Code Playgroud)
SQLSTATE[HY000]:一般错误:3065 ORDER BY 子句的表达式 #1 不在 SELECT 列表中,引用列...不在 SELECT 列表中;这与 DISTINCT 不兼容
现在我已经搜索了解决方案,基本上找到了很多禁用ONLY_FULL_GROUP_BY的建议。禁用 ONLY_FULL_GROUP_BY
一些评论指出,为了遵守 sql 标准而这样做是不明智的。那么这怎么可能以一种有效的方式实现呢?
小智 5
你可以试试这样:
$query = $repository->createQueryBuilder('b')
->select('(b.course) AS course')
->leftJoin('AppBundle:Booking', 'b2', 'WITH', 'b.course = b2.course AND b.id < b2.id)
->where('b2.id IS NULL')
->orderBy('b.id', 'DESC')
->setMaxResults(5)
->getQuery();
Run Code Online (Sandbox Code Playgroud)
您将只获得每门课程具有最大 id 的预订,因此无需按课程分组。
| 归档时间: |
|
| 查看次数: |
2753 次 |
| 最近记录: |