我正在尝试获取最新预订的课程(唯一)。我已经尝试使用Doctrine querybuilder进行以下操作:

$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();


没有orderby,它可以工作,但是它将遍历预订。我需要最新预订的课程。通过此查询,我得到此错误:


  SQLSTATE [42000]:语法错误或访问冲突:1055表达式#1
  的ORDER BY子句不在GROUP BY子句中,包含
  非汇总列...不是
  功能上取决于GROUP BY子句中的列;这是
  与sql_mode = only_full_group_by不兼容500 Internal Server
  错误-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'
);



  SQLSTATE [HY000]:常规错误:3065 ORDER BY子句的表达式#1
  不在SELECT列表中,引用列...不在SELECT中
  清单这与DISTINCT不兼容


现在,我已经搜索了解决方案,并且基本上发现了许多禁用ONLY_FULL_GROUP_BY的建议。 Disable ONLY_FULL_GROUP_BY

一些评论指出,这样做不符合sql标准是不明智的。那么如何以可行的方式实现呢?

最佳答案

您可以这样尝试:

$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();


您只会获得每门课程ID最高的预订,因此无需按课程分组。

10-06 09:46