3

我正在尝试使用此查询: MySQL SELECT DISTINCT by high 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 ;");

引发此错误:[Semantical Error] line 0, col 127 near 'SELECT': Error: Identification Variable(用于连接路径表达式,但之前未定义。

我假设由于这个Symfony2 Doctrine 查询

我怎样才能维护我的映射,同时仍然能够按 onsale 对每个项目进行排序?

4

2 回答 2

1

您是否考虑过将其拆分为两个查询:

首先:直接针对数据库连接运行查询,并按您想要的顺序返回相关行的 ID。这将您的复杂查询与 DQL 分开。

第二:通过 Doctrine 查询行以获得您想要的完整实体,基于先前查询的 ID/订单。

于 2012-07-25T16:56:20.027 回答
1

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

于 2012-07-31T17:22:54.593 回答