在subselect上的Symfony2 Doctrine SQL对象映射

时间:2012-07-23 10:28:13

标签: symfony doctrine dql

我正在尝试使用此查询: MySQL SELECT DISTINCT by highest value

    SELECT 
    p.*
FROM    
      product p
    INNER JOIN
        ( SELECT 
              magazine, MAX(onSale) AS latest
          FROM
              product
          GROUP BY 
              magazine
        ) AS groupedp
      ON  groupedp.magazine = p.magazine
      AND groupedp.latest = p.onSale ;

在Symfony2和DQL中。

我有:

$query = $em->createQuery("SELECT p FROM MyBundle:Product p WHERE p.type = 'magazine' AND  p.maglink IS NOT NULL OR (p.type = 'magazine' AND  p.diglink IS NOT NULL) GROUP BY p.magazine ORDER BY p.onSale DESC");

使用和输出对象但没有正确的MAX(onSale)

做:

 $query = $em->createQuery("SELECT p , MAX(p.onSale) FROM MyBundle:Product p WHERE p.type = 'magazine' AND  p.maglink IS NOT NULL OR (p.type = 'magazine' AND  p.diglink IS NOT NULL) GROUP BY p.magazine ORDER BY p.onSale DESC");

返回非对象的结果。

此:

$query = $em->createQuery("SELECT
            p.*
            FROM
            MyBundle:Product p
            INNER JOIN
            ( SELECT
                    p.magazine, MAX(onSale) AS p.latest
                    FROM
                    MyBundle:Product p
                    GROUP BY
                    p.magazine
            ) AS groupedp
            ON  groupedp.magazine = p.magazine
            AND groupedp.latest = p.onSale ;");

引发此错误: [语义错误]第0行,第127行靠近'SELECT ':错误:标识变量(用于连接路径表达式,但之前未定义。

我假设由于这个Symfony2 Doctrine query

如何在仍然可以按onsale对每个项目进行排序的同时保持我的映射?

2 个答案:

答案 0 :(得分:1)

您是否考虑将此分为两个查询:

<强>第一: 直接针对数据库连接运行查询,并按所需顺序返回相关行的ID。这会将您的复杂查询与DQL分开。

<强>第二: 根据Doctrine查询行,根据前一个查询的ID /顺序获取所需的完整实体。

答案 1 :(得分:1)

这是一个黑暗中的镜头,但似乎相当明显。您将两个表别名到同一个别名。因此当你使用p。在连接中,它认为您在连接之前从p的原始定义开始工作,然后将连接别名为p。更改连接的别名(以及对该表的引用),以便每个别名都是唯一的。