【问题标题】:Doctrine2 "order by" before "group by"Doctrine2 在“分组依据”之前“排序依据”
【发布时间】:2014-02-04 21:08:49
【问题描述】:

我知道 3 年前有人问过类似的问题 (Doctrine2 Order By before Group By),但也许从那时起有些事情发生了变化。

我有 2 个实体属性:

orderId
orderUpdateDate

两者都设置为唯一的,但为了列出我需要最后更新日期,所以排序应该是

order by orderUpdateDate DESC

然后按 orderId 分组,所以我只有一次订单。

group by orderId

问题是,当我在查询构建器中将两者都粘贴到一个查询中时,我得到了随机的订单列表

【问题讨论】:

    标签: symfony doctrine-orm dql


    【解决方案1】:

    要获得这样的结果,您必须使用以下 SQL 查询:

    SELECT n.id, n.update_date
    FROM (
        SELECT o.id, o.update_date
        FROM orders o 
        ORDER BY o.update_date DESC
    ) n 
    GROUP BY n.id;
    

    不幸的是,Doctrine 的 DQL 不支持 FROM 子句中的嵌套查询。但是,它允许您创建一个可以由 ORM 映射的自定义 native SQL query

    $rsm = new ResultSetMappingBuilder($em);
    $rsm->addRootEntityFromClassMetadata('MyProject\\Order', 'o');
    
    $sql = sprintf('SELECT %s FROM (SELECT ...) GROUP BY ...', $rsm->generateSelectClause());
    
    $query = $em->createNativeQuery($sql, $rsm);
    $result = $query->getResult();
    

    【讨论】:

    • 我必须将“ORDER BY n.update_date”添加到主查询中,现在效果很好。非常感谢您的帮助。
    • 是否有可能将“count(n.id) as id_num”添加到这样的查询中,以便在结果中还包含每个订单的订单更新数量?我试过了,查询没问题,但不知道如何使用这个值,因为 symfony 说没有方法 id_num
    猜你喜欢
    • 2014-04-23
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多