2012-07-23 30 views
3

我試圖用這個查詢Symfony2的教義SQL對象映射: 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的每個項目進行排序?

回答

1

你有沒有考慮過拆分到這兩個查詢:

首先: 直接對數據庫連接運行查詢,並返回相關行的ID,在你想要的順序。這將您複雜的查詢從DQL中分離出來。

第二個: 根據前一個查詢的ID /順序,通過Doctrine查詢行以獲取所需的完整實體。

+0

雖然這顯然會起作用(並且我非常感謝您的回答),但似乎奇怪的是,DQL需要在數據庫上進行2次點擊以進行此類看似簡單的查詢。現在我只使用原始SQL而不是DQL。 – BobFlemming 2012-07-27 11:34:43

1

這是在黑暗中拍攝的,但看起來相當明顯。您將兩個表別名爲相同的別名。因此當你使用p。在連接中它認爲你從連接之前的p的原始定義開始工作,那麼你將連接別名爲p。更改連接的別名(以及對該表的引用),以便每個別名都是唯一的。