学说加入MAX()

时间:2014-10-17 07:37:40

标签: php symfony doctrine

我有实体

Template {

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

}


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

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

}

并尝试通过TemplateSnapshot

中的最后一个modTime获取模板
QueryBuilder $query
                    ->leftJoin('EditorBundle:TemplateSnapshot','s','WITH', $tableAlias.'.id = s.template_id')
                    ->groupBy($tableAlias.'.id')
                    ->orderBy('s.modTime','desc')
            ;

我得到了

  

SELECT 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 TemplateSnapshot 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')
            ;

我得到:

  

SELECT 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然后订购所以不要最新。

1 个答案:

答案 0 :(得分:1)

您需要为此目的实现Native查询。查询应如下所示:

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的行。