如何在DQL中使用GROUP BY获取每个组中的最新记录?

时间:2017-02-16 19:07:34

标签: mysql sql

我无法在我拥有的symfony2项目中获得此查询。

我的表:Case_file

id  id_student  last_course  Academic_year  
---|----------|------------|--------------
1  |    1     | 1º Primary |  2014 / 2015   
2  |    2     | 2º Primary |  2014 / 2015
5  |    3     | 1º Primary |  2014 / 2015  
3  |    1     | 2º Primary |  2015 / 2016    
4  |    2     | 3º Primary |  2015 / 2016 

我需要为每个学生获得根据学年的最后一份记录。

通过以下查询,我获得了每个学生的第一行:

public function findOldEstudent()
{

return $this->getEntityManager()->createQuery(
        'SELECT c FROM BackendBundle:case_file c INNER JOIN c.student s  WHERE s.active=0 GROUP BY s.id   ')
    ->getResult();
}

我在下表中显示了哪些解决方案:

id  id_student  last_course  Academic_year  
---|----------|------------|--------------
1  |    1     | 1º Primary |  2014 / 2015   *
2  |    2     | 2º Primary |  2014 / 2015   *
3  |    3     | 1º Primary |  2014 / 2015  

我想要的是根据学年获得最后一行,如下表所示:

id  id_student  last_course  Academic_year  
---|----------|------------|--------------
1  |    1     | 2º Primary |  2015 / 2016    *
2  |    2     | 3º Primary |  2015 / 2016    *
3  |    3     | 1º Primary |  2014 / 2015  

为此,我尝试在以下查询中使用ORDER BY对行进行排序,但它会继续返回找到的第一行:

public function findOldEstudent()
{

return $this->getEntityManager()->createQuery(
        'SELECT c FROM BackendBundle:case_file c INNER JOIN c.student s  WHERE s.active=0 GROUP BY s.id ORDER BY c.academic_year DESC')
    ->getResult();
} 

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我终于通过以下查询解决了问题:

public function findOldEstudent()
{

 return $this->getEntityManager()->createQuery(
    'SELECT c FROM BackendBundle:case_file c INNER JOIN c.student s  WHERE c.academic_year IN (select MAX(ca.academic_year) FROM BackendBundle:case_file ca INNER JOIN ca.student st GROUP BY st.id) and s.active=0')
    ->getResult();
 } 

我遇到的问题是我在子选择中使用了相同的别名,因为它发生在另一个类似的情况here中,我不记得了。

希望有所帮助。