0

我正在从一组中的每个班级中搜索一名学生。有不同的班级小组,每个小组都有不同的班级,每个班级都有多个学生。见下文:

Group1 --> Class1, Class2 etc
Class1 --> GreenStudent1, GreenStudent2 etc
Class2 --> RedStudent1, RedStudent2 etc
------------------------------------------------------

SELECT 
   table1.id,
   table1.myname,
   table1.marks
   table2.studentid,
   table2.studentname
FROM table1
   INNER JOIN table3 ON table1.oldid = table3.id
   INNER JOIN table2 ON table2.studentid = table3.newid
WHERE 
   table1.classgroup = 'SCI79' 
GROUP BY table1.oldid
ORDER BY table1.marks DESC

查询中应用了不同的连接。上面提到的查询给了我正确的结果,但我几乎不需要修改它。当前查询返回我每个班级的一名学生。

我需要的?我需要每个班级的一个学生,但只有那个学生有 MAXIMUM

 table1.marks

所以我应该让每个班级的一名学生在他们的相关班级中人数最多。任何人都可以提出一些解决方案或重写此查询吗?谢谢 :)

4

2 回答 2

2

an 上的子查询INNER JOIN应该处理这个问题:

SELECT t1.id
   ,t1.myname
   ,maxMarks.marks
   ,t2.studentid
   ,t2.studentname
FROM table1 t1
INNER JOIN table3 t3 ON t1.oldid = t3.id
INNER JOIN table2 t2 ON t2.studentid = t3.newid
INNER JOIN (
   SELECT id
      ,MAX(marks) AS marks
   FROM table1
   GROUP BY id
) maxMarks ON t1.id = maxMarks.id
   AND t1.marks = maxMarks.marks
WHERE t1.classgroup = 'SCI79'
GROUP BY t1.oldid
ORDER BY t1.marks DESC

将带有 MAX 的聚合表连接起来,应该将结果集过滤到每个学生及其各自的最高分。

编辑

我想我误读了你原来的问题......你只想要有这个MAX(marks)时期的学生吗?在这种情况下,请使用以下查询:

SELECT t1.id
   ,t1.myname
   ,t1.marks
   ,t2.studentid
   ,t2.studentname
FROM table1 t1
INNER JOIN table3 t3 ON t1.oldid = t3.id
INNER JOIN table2 t2 ON t2.studentid = t3.newid
WHERE t1.classgroup = 'SCI79'
   AND t1.marks = (
      SELECT MAX(marks) AS marks
      FROM table1
   )
GROUP BY t1.oldid
ORDER BY t1.marks DESC

WHERE子句将仅返回在整个表中具有与 MAX 标记匹配的标记的学生。

于 2013-10-30T15:58:24.457 回答
0

您可以使用 max 函数,例如:

where table1.marks = max(table1.marks)
于 2013-10-30T16:04:02.840 回答