【问题标题】:Symfony doctrine orderby and group by (distinct)Symfony 学说 orderby 和 group by (distinct)
【发布时间】:2017-05-19 23:08:17
【问题描述】:

我正在尝试获取最新预订的课程(唯一)。我使用 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();

没有 orderby 它可以工作,但它会遍历预订升序。我需要最新预订的课程。使用此查询,我收到此错误:

SQLSTATE[42000]:语法错误或访问冲突:1055 表达式 #1 ORDER BY 子句不在 GROUP BY 子句中并且包含 非聚合列...不是 功能上依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 500 内部服务器不兼容 错误 - 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]:一般错误:ORDER BY 子句的 3065 表达式 #1 不在 SELECT 列表中,引用列...不在 SELECT 中 列表;这与 DISTINCT 不兼容

现在我已经搜索了解决方案,基本上找到了很多禁用 ONLY_FULL_GROUP_BY 的建议。 Disable ONLY_FULL_GROUP_BY

一些 cmets 指出,为了遵守 sql 标准,这样做是不明智的。那么这怎么可能以一种可行的方式实现呢?

【问题讨论】:

  • 您能否提供有关您的实体的更多信息?它们是如何映射的? (我猜是 ManyToOne 单向的)
  • ManyToOne 双向,因为级联删除,因为没有课程就无法预订

标签: mysql sql symfony orm doctrine-orm


【解决方案1】:

你可以试试这个方法:

$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 预订,因此无需按课程分组。

【讨论】:

  • 左连接具有魔力。对于每个 b/b2 对 b.id
  • 感谢您的大力帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2010-09-30
  • 1970-01-01
相关资源
最近更新 更多