2014-10-17 133 views
0

我有實體學說與MAX()

Template { 

    /** 
    * @ORM\OneToMany(targetEntity="TemplateSnapshot", mappedBy="template", cascade={"all"}) 
    */ 
    protected $snapshots; 

} 


/** 
* @ORM\Entity 
*/ 
class TemplateSnapshot { 

    /** 
    * @ORM\Column(type="datetime") 
    * @var \DateTime 
    */ 
    protected $modTime; 

} 

並嘗試獲得通過模板最後modTime在TemplateSnapshot有序

QueryBuilder $query 
        ->leftJoin('EditorBundle:TemplateSnapshot','s','WITH', $tableAlias.'.id = s.template_id') 
        ->groupBy($tableAlias.'.id') 
        ->orderBy('s.modTime','desc') 
      ; 

我得到

選擇t0_.id AS ID0加盟,t0_.location AS location1,t0_.name AS name2,t1_.modTime AS modTime3 FROM Template t0_ LEFT JOIN TemplateSnapshot t1_ ON t0_.id = t1_.template_id LEFT JOIN TemplateSnap shot t2_ ON(t0_.id = t2_.template_id)WHERE t0_.name LIKE? GROUP BY t0_.id ORDER BY t2_.modTime DESC LIMIT 20

此返回第一個連接行。 (第一組然後排序)。我想與最新的TemplateSnapshot

其他獲得加入嘗試

$query 

       ->leftJoin('TemplateEditorBundle:TemplateSnapshot', 
        's', 
        'WITH', 
        $tableAlias.'.id = s.template_id and s.modTime = MAX(s.modTime)' 
       ) 
       ->groupBy($tableAlias.'.id') 
       ->orderBy('s.modTime','desc') 
      ; 

此我得到:

選擇t0_.id AS ID0,t0_.location AS LOCATION1,t0_.name AS NAME2,t1_ .modTime AS modTime3,MAX(t2_.modTime)AS sclr4 FROM Template t0_ LEFT JOIN TemplateSnapshot t1_ ON t0_.id = t1_.template_id LEFT JOIN TemplateSnapshot t2_ ON(t0_.id = t2_.template_id AND t2_.modTime = MAX(t2_。 modTime))WHERE t0_.name LIKE? ORDER BY t2_.modTime DESC LIMIT 20

和錯誤

enter code here無效使用組功能

其他的想法

的我嘗試直接查詢TemplateSnapshot

$source = new Entity('TemplateEditorBundle:TemplateSnapshot'); 

$query 
        ->orderBy($tableAlias.'.modTime','desc') ->groupBy($tableAlias.'.template_id') 
      ; 

但它首先gorup,然後訂購,所以不會得到最新的。

+0

你想要檢索什麼? – 2014-10-17 08:28:16

+0

我想通過modDate使用唯一的模板獲取TemplateSnapshot。 TemplateSnapshot有template_id行。 – 2014-10-17 09:05:30

+0

你需要'Template'數據的每一行或'template_id'就夠了嗎? – 2014-10-17 09:27:24

回答

1

您需要爲此目的實現本機查詢。查詢應該是這樣的:

SELECT * FROM TemplateSnapshot ts 
INNER JOIN 
(SELECT MAX(mod_time) AS mod_time, template_id FROM TemplateSnapshot GROUP BY template_id) AS ts_max 
ON ts.template_id = ts_max.template_id AND ts.mod_time = ts_max.mod_time 

此查詢將與mod_time最大值返回你只行從TemplateSnapshot每一個Template