例如有表 T_STUDENT,T_SCORE, student表主键ID,还有一列NAME,score 表有外键 STUDENTID, ENGLISH,MATH,CHINESE,score 表记录每个学生不同科目,不同时间,的成绩
现在要查询出所有学生 各门成绩最好的记录
结果集如下
NAME  MAXENGLISH  MAXMATH  MAXCHINESE我用的是子查询的方法,但效率好低啊,数据量一大,慢得要死
请问有什么高效的方法吗

解决方案 »

  1.   

    select m.* , n.*
    from T_STUDENT m ,T_SCORE n
    where m.STUDENTID = n.STUDENTID and n.score = (select max(score) from T_SCORE where 科目 = n.科目)select m.* , n.*
    from T_STUDENT m ,T_SCORE n
    where m.STUDENTID = n.STUDENTID and not exists (select 1 from T_SCORE where 科目 = n.科目 and score > n.score)不过:建议你提供详细的资料:
    例如表的结构,表之间的关系,测试数据,相关算法及需要的结果。
    这样有助于我们理解你的意思,更主要的是能尽快让你获得答案或解决问题的方法。
      

  2.   


    将你的查询条件字段上建索引(最好能建个包含索引)
    比如
    create index idx_name on table_name include (NAME,MAXENGLISH,MAXMATH,MAXCHINESE)
      

  3.   

    select NAME,MAX(ENGLISH) as MAXENGLISH 
    ,MAX(MATH)as MAXMATH
    ,MAX(CHINESE) as MAXCHINESE
    FROM T_STUDENT S Inner join T_SCORE SC on T.ID=SC.STUDENTID
    GROUP BY NAME
    ???????
      

  4.   

    select NAME,max(ENGLISH) as MAXENGLISH,max(MATH ) as MAXMATH ,
    max(HINESE) as MAXCHINESE from T_STUDENT left join T_SCORE
    on T_STUDENT.id=T_SCORE.STUDENTID
      

  5.   

    select NAME,max(ENGLISH) as MAXENGLISH,max(MATH ) as MAXMATH ,
    max(HINESE) as MAXCHINESE from T_STUDENT left join T_SCORE
    on T_STUDENT.id=T_SCORE.STUDENTID 
    where date ......
    group by NAME
      

  6.   

    用连接吧,不要用子查询select A.NAME,B.MAXENGLISH,B.MAXMATH,B.MAXCHINESE
    from  T_STUDENT A 
    inner join
    (
    select STUDENTID,max(ENGLISH) as MAXENGLISH,max(MATH) as MATH,max(CHINESE) as CHINESE
    from T_SCORE 
    group by STUDENTID
    ) B on B.STUDENTID = A.Id
      

  7.   

    在连接后面继续写条件即可.
    select NAME,max(ENGLISH) as MAXENGLISH,max(MATH ) as MAXMATH ,
    max(HINESE) as MAXCHINESE from T_STUDENT left join T_SCORE
    on T_STUDENT.id=T_SCORE.STUDENTID and 其他条件.
      

  8.   

    select m.* , n.*
    from T_STUDENT m ,T_SCORE n
    where m.STUDENTID = n.STUDENTID
    and n.score = (select max(score) from T_SCORE where 科目 = n.科目 and STUDENTID =nSTUDENTID )首先我局的上面很多语句可能结果都不对
    其次外键这东西根本没必要用
    再然后 score 里面的有个 自增id 作为主键 
    科目,学生id, 分数 这三列上有一个普通索引
    这三个属性确定一个学生的成绩,这三个条件也最用以组合起来使用。主键默认情况会加聚集索引,没有主键的表,普通索引的利用率很低的