Makumba列表按子集排序

时间:2012-03-02 20:02:49

标签: subquery makumba

假设我们有以下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”,则只会使用第一个创建的教育进行排序。例如:

  • 学生1入读A大学并于2009年6月毕业
  • 学生2赴大学B并于2010年6月毕业
  • 学生3进入C大学并于2010年5月毕业,然后进入D大学并于2011年5月毕业。

所以我希望他们这样排序:

  1. 学生3(2011年5月)
  2. 学生2(2010年6月)
  3. 学生1(2009年6月)
  4. 但我明白了:

    1. 学生2(2010年6月)
    2. 学生3(2010年5月)
    3. 学生1(2009年6月)
    4. 有没有办法强迫makumba为每个学生完成所有“教育”项目,按“毕业”排序并使用最新日期对学生进行排序?

1 个答案:

答案 0 :(得分:3)

您最有可能需要使用子查询来解决此问题。让我在这里概述一种方法(现在在纯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

选择子查询中学生的最新毕业日期,然后在主查询中仅选择具有最高毕业日的教育。

鉴于,如果您的学生在同一天结束了两项研究,您可能会从中获得重复。所以添加一个

 'group by s'
可能需要