【问题标题】:Symfony2 Doctrine SQL object mapping on subselect子选择上的 Symfony2 Doctrine SQL 对象映射
【发布时间】:2012-07-21 13:59:52
【问题描述】:

我正在尝试使用此查询: 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 对每个项目进行排序?

【问题讨论】:

    标签: symfony doctrine dql


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      第二: 根据上一个查询的 ID/顺序,通过 Doctrine 查询行以获得您想要的完整实体。

      【讨论】:

      • 虽然这显然可行(我很欣赏你的回答),但对于这样一个看似简单的查询,DQL 需要 2 次命中数据库似乎很奇怪。现在我只是使用原始 SQL 而不是 DQL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多