例如有表 T_STUDENT,T_SCORE, student表主键ID,还有一列NAME,score 表有外键 STUDENTID, ENGLISH,MATH,CHINESE,score 表记录每个学生不同科目,不同时间,的成绩
现在要查询出所有学生 各门成绩最好的记录
结果集如下
NAME MAXENGLISH MAXMATH MAXCHINESE
我用的是子查询的方法,但效率好低啊,数据量一大,慢得要死
请问有什么高效的方法吗
------解决方案--------------------
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)
不过:
- SQL code
建议你提供详细的资料:例如表的结构,表之间的关系,测试数据,相关算法及需要的结果。这样有助于我们理解你的意思,更主要的是能尽快让你获得答案或解决问题的方法。
------解决方案--------------------
- SQL code
将你的查询条件字段上建索引(最好能建个包含索引)比如create index idx_name on table_name include (NAME,MAXENGLISH,MAXMATH,MAXCHINESE)
------解决方案--------------------
- SQL code
select NAME,MAX(ENGLISH) as MAXENGLISH ,MAX(MATH)as MAXMATH,MAX(CHINESE) as MAXCHINESEFROM T_STUDENT S Inner join T_SCORE SC on T.ID=SC.STUDENTIDGROUP BY NAME
------解决方案--------------------
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
------解决方案--------------------
索引会加快速度
------解决方案--------------------
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
------解决方案--------------------
用连接吧,不要用子查询
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
------解决方案--------------------
------解决方案--------------------
- SQL code
select m.* , n.*from T_STUDENT m ,T_SCORE nwhere m.STUDENTID = n.STUDENTIDand n.score = (select max(score) from T_SCORE where 科目 = n.科目 and STUDENTID =nSTUDENTID )
------解决方案--------------------
至于连接还是子查询好是根据你自己的实际情况来定夺的,要看执行计划,不是凭空想象的。