Doctrine DQL - 如何仅从数据集中选择唯一记录

时间:2015-03-04 09:03:40

标签: symfony doctrine-orm dql

我的任务是从数据库中选择一个品牌和具有该品牌最高订单价值的客户(连同订单价值)。

我提出了这个问题:

    $ordersQuery = $em->createQuery(
            "SELECT b.name AS brand, c.name, MAX(DISTINCT o.value) AS total
            FROM AppBundle:VOrder o
            LEFT JOIN o.brand b
            LEFT JOIN o.customer c
            GROUP BY b.id, c.id"
    ); 

查询结果是这样的记录:

  

品牌#1(顾客#5 - 7.00)

     

品牌#1(顾客#27 - 35.00)

     

品牌#1(顾客#32 - 169.00)

     

品牌#1(顾客#38 - 101.00)

     

品牌#2(顾客#334 - 21.00)

     

品牌#2(顾客#344 - 61.00)

     

品牌#2(顾客#364 - 159.00)

     

品牌#2(顾客#427-170.00)

正如您所看到的,每个品牌都有很多记录。

如何修改我的查询,以便只显示每个品牌(以及客户)的订单价值最高的一条记录?

1 个答案:

答案 0 :(得分:1)

我认为用DQL执行它是不可能的,但你可以这样做原始查询:

SELECT t1.maxvalue, b.name AS brand, c.name
FROM VOrder o
JOIN  (
    SELECT MAX(DISTINCT value) as maxvalue, brandId 
    FROM VOrder
    GROUP BY brandId
) as t1 ON (o.value = maxvalue AND o.brandId = t1.brandId)
LEFT JOIN brand b ON (...)
LEFT JOIN customer c ON (...)

您可以使用new Doctrine_RawSql()构建它。

使用例:Doctrine - subquery in from