2012-09-08 49 views
2

我想从db获得学生名单,每个班级都有学生姓名的最大号码。使用MySQL DB。获取每个班级中最大号码的学生列表

我有一个学生,班级,结果(与不同年份的结果)

表结构的学生(student_id数据,student_name,类标识码,地址),类(类标识码,CLASS_NAME),结果如下表(re​​sult_id,student_id数据,今年,引号)

,我需要列出像

Student Name class Marks 
Jon   A-1  800 
Steve   B-1  789 
+0

我猜你错过了包括完整表结构。 –

+0

更多详细信息请 – S3ddi9

+3

如何包括一些更多的信息,如:数据库,版本,列,数据,预期结果,你已经试过 –

回答

4

编辑更正后的代码,评论是正确的

尝试在代码这个SQL Fiddle link

+1

现在你的学生的名字是随机的。最好的B-1班应该是安娜而不是史蒂夫。感谢您连接SQL小提琴,我重复使用它! – Andomar

+0

更正后,只需按类名更改[GROUP BY]子句即可获得最大结果 – Yaroslav

+0

是的,你在哪儿右@Andomar,学生的名字随机选取。需要一个子查询来获得正确的,类似于你的解决方案,但是使用'MAX'而不是'LIMIT'。更正和测试 – Yaroslav

3

你可以使用一个子查询,每类最高分来筛选学生:

select s.student_name 
,  c.class_name 
,  r.marks 
from results r 
join student s 
on  r.student_id = s.student_id 
join class c 
on  c.class_id = s.class_id 
where r.result_id = 
     (
     select r2.result_id 
     from student s2 
     join results r2 
     on  s2.student_id = r2.student_id 
     where c.class_id = s2.class_id 
     order by 
       r2.marks desc 
     limit 1 
     ) 

Live example at SQL Fiddle.

+0

这是另一种选择,但使用GROUP BY和MAX更清晰,你不觉得吗? – Yaroslav

1
select s1.student_name, c1.class_name, r1.marks 
from student s1, class c1, results r1, 
    (select s2.class_id, max(r2.marks) marks 
    from results r2, student s2 
    where r2.student_id = s2.student_id 
    group by s2.class_id) agg 
where r1.marks  = agg.marks 
    and r1.student_id = s1.student_id 
    and s1.class_id = c1.class_id 
    and s1.class_id = agg.class_id