2

次のStudent.mddがあるとします。

person=not null ptr general.Person
interests=set general.ActivityField
education=set
  education->university=not null ptr general.University
  education->graduation=date

絵画に興味のあるすべての学生(where = "interests.name ='painting'")を一覧表示し、最新の卒業日で並べ替えます。

単にorderBy="student.education.graduation desc"を使用すると、最初に作成された教育のみが並べ替えに使用されます。例えば:

  • Student1はA大学に進学し、2009年6月に卒業しました。
  • Student2はB大学に進学し、2010年6月に卒業しました。
  • Student3はC大学に進学し、2010年5月に卒業し、D大学に進学し、2011年5月に卒業しました。

だから私はそれらを次のようにソートすることを期待しています:

  1. Student3(2011年5月)
  2. Student2(2010年6月)
  3. Student1(2009年6月)

しかし、私はこれを取得します:

  1. Student2(2010年6月)
  2. Student3(2010年5月)
  3. Student1(2009年6月)

makumbaに各生徒のすべての「教育」項目を強制的に実行させ、それらを「卒業」で並べ替え、最新の日付を使用して生徒を並べ替える方法はありますか?

4

1 に答える 1

3

ほとんどの場合、サブクエリを使用してこれを解決する必要があります。ここで1つのアプローチの概要を説明します(純粋なOQLでは、JSP taglibに適合させる必要があります)

まず比較のために、まず限られた数の人を選択します

SELECT p, p.name, e.graduation from Student s, s.person p, s.education e 
     WHERE p.name='name1' or p.name='name2'
     ORDER BY p.name, e.graduation DESC

人々が複数の研究をしている場合、これは明らかにあなたに重複を与えます。ただし、重複を減らすために人ごとにグループ化する場合は、最新の日付を選択することはできません。それはあなたがあなたの例で暗黙のうちに行うことだと私は思います。

そのため、どういうわけか、各学生の卒業日が最も遅い教育のみを選択するように制限し、そのリストで並べ替える必要があります。これは、たとえば次のように実現できます。

SELECT p, p.name, e.graduation from Student s, s.person p, s.education e
     WHERE (p.name='name1' or p.name='name2')
     AND e.graduation in 
       (SELECT max(e2.graduation) from Student s2, s2.education e2 where s=s2)
     ORDER BY e.graduation DESC

これにより、サブクエリで学生の最新の卒業日が選択され、メインクエリでその卒業日が最も高い教育のみが選択されます。

同じ日に終了する2つの研究を持つ学生がいる場合、そこから重複する可能性があります。したがって、

 'group by s'

必要になるかもしれません。

于 2012-03-02T21:30:19.223 に答える