2017-02-16 62 views
0

我無法在我有的symfony2項目中得到這個查詢。如何在DQL中使用GROUP BY獲取每個組中的最新記錄?

我表: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行按下列查詢排序,但它仍然返回找到的第一行:

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(); 
} 

我感謝你的幫助。

+0

選擇所有內容後按順序排列順序,而不是按照您的意願順序排列。 – Linkan

+0

感謝@Linkan,我明白,但您是否知道如何獲得該解決方案?我需要能夠以降序搜索,直到找到每個學生的第一行,這將是該案例中記錄的最後一行。 – Joseph

+0

要走的路是SELECT id_student,MAX(Academic_year)AS Academic_year FROM表名GROUP BY id_student在加入id_student和學年的最後課程之後。 – Linkan

回答

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,我不記得了。

希望有所幫助。

相關問題