姓名 科目 考试时间   名次
张三 语文 2012-02-12  2
李四 语文 2012-03-12  6
王五 语文 2012-03-16  8
张三 数学 2012-03-14  5
李四 数学 2012-03-16  6
…………上面是一个考试成绩表,不同学生考试时间不同,怎么写查询语句,可以查出某个学生所有科目的最后一次考试名次?
应该需要用到group by 吧?但没搞出来,请大家指点一下。谢谢

解决方案 »

  1.   

    学生所有科目的最后一次考试名次?  是什么意思 
    select 学生姓名 from table 
    where 考试时间 limit 1 
      

  2.   

    select 学生姓名 from table  
    where 考试时间=最后考试时间
    group by 名次  
      

  3.   

    select *
    from tb A
    where not exists (select 1 from tb B where A.姓名=B.姓名 and A.科目=B.科目 and A.考试时间>B.考试时间)
      

  4.   

    select * from 成绩表 where 姓名='张三' order by 考试时间 DESC LIMIT 1;
      

  5.   

    select 名次 from 表 
    where name=某人 
    and 考试时间=(select max(考试时间) from 表 where name=某人)
      

  6.   

    谢谢大家的关注!
    不好意思,我表述不清楚,我的意思是怎么写查询语句,可以查出“所有”学生“所有”科目的最后一次考试名次?
    3楼 rucypli 的方法正是我需要的,表述不正确都能被理解,牛啊!哈哈!
    不过有一点点小错误,应该是小于号 NOT EXISTS (SELECT ... AND A.考试时间 < B.考试时间)
      

  7.   

    select 姓名,科目,max(考试时间),名次 from table group by 姓名,科目;
      

  8.   

    谢谢 7楼的 sdojqy1122 你的方法也可以实现,我的表中有id字段SELECT * FROM tab WHERE id IN (SELECT MAX(id) FROM tab GROUP BY 姓名, 科目)这种方式和3楼的 NOT EXISTS 方法,都是逐行查询的吧?不知道哪种效率更高,现在数据量太少,没法比较。如果数据量特别大的话,会不会拖死服务器? 留待以后再验证