【问题标题】:Doctrine / SQL query MAX with GroupBy使用 GroupBy 的 Doctrine / SQL 查询 MAX
【发布时间】:2017-06-12 21:58:36
【问题描述】:

我的目标是选择 createdAt 最高的列,按用户分组。

如果我执行以下操作:

$qb = $this->createQueryBuilder('qb1');
$q = $qb
  ->select('pbs, MAX(pbs.createdAt) AS HIDDEN pbs_created')
  ->add('from', 'MyEntity pbs')
  ->groupBy('pbs.user')
  ->orderBy('pbs_created', 'ASC')
  ->getQuery();
return $q->getResult();

我明白了:

+------+---------------------+---------------------+--------------+
| id_0 | createdAt_3         | sclr_5              | project_id_7 |
+------+---------------------+---------------------+--------------+
| 2137 | 2014-10-07 10:52:29 | 2017-04-25 15:42:42 |          116 |
+------+---------------------+---------------------+--------------+
+------+---------------------+---------------------+--------------+
| 5123 | 2015-11-02 15:02:55 | 2017-05-02 05:36:18 |          118 |
+------+---------------------+---------------------+--------------+

问题是我得到了最大值,但返回的行不包含最大值。

如何获取由用户分组的最新 createdAt 以及关联的实体数据?

【问题讨论】:

    标签: php mysql symfony doctrine-orm


    【解决方案1】:

    它与订购无关。 MAX() 为您提供最大值,但不是具有最大值的行

    看看这些 SO 问题

    问题是 - 使用 Doctine 的 QueryBuilder 很难实现这两种解决方案。 不过子查询是可能的 - http://melikedev.com/2013/06/07/php-doctrine-dql-select-subquery/

    【讨论】:

    • 我已经想过这样的事情,并使用您建议的解决方案(子选择)构建了一个本机查询。
    • 想知道为什么 DQL 不能处理子选择。
    • 链接失效了
    【解决方案2】:

    您是否尝试过更改 orderBy? 像这样:

    ->orderBy('pbs_created', 'DESC')
    

    【讨论】:

    • 是的。 orderBy 只会影响分组依据,因此它只会对您的“旧”或“不需要”条目进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多