2017-02-16 5 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 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(); 
} 

私はあなたの助けに感謝します。

+0

すべてを選択した後のソート順ですが、それ以外の方法ではできません。 – Linkan

+0

@Linkanありがとうございます、私は理解していますが、その解決方法を知っていますか?私は各生徒の最初の行が見つかるまで降順で検索する必要があります。これはその場合に記録された最後の行です。 – Joseph

+0

行く方法はSELECT id_student、MAX(Academic_year)AS Academic_year FROM tablename 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で起こったと私は覚えていないとして、私は、副選択で同じエイリアスを使用したことです。

希望に役立ちます。

関連する問題