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 2010年5月去C大学毕业,2011年5月去D大学毕业

所以我希望让它们像这样排序:

  1. 学生 3(2011 年 5 月)
  2. 学生 2(2010 年 6 月)
  3. 学生 1(2009 年 6 月)

但我明白了:

  1. 学生 2(2010 年 6 月)
  2. 学生 3(2010 年 5 月)
  3. 学生 1(2009 年 6 月)

有没有办法强制 makumba 为每个学生检查所有“教育”项目,按“毕业”排序并使用最新日期对学生进行排序?

4

1 回答 1

3

您很可能需要使用子查询来解决这个问题。让我在这里概述一种方法(现在在纯 OQL 中,需要针对 JSP 标签库进行调整)

首先进行比较,先选择有限的人数

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'

可能需要。

于 2012-03-02T21:30:19.223 回答