SELECT a.c_id, a.s_score AS score_01, b.s_score AS score_02 FROM score a, score b WHERE a.s_id = b.s_id AND a.c_id ='01' AND b.c_id ='02' AND a.s_score > b.s_score
Step2.连接Student表查询出学生信息,可以直接连,也可以使用临时表连接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 直接添加Student表进行连接查询 SELECT s.*, a.s_score AS score_01, b.s_score AS score_02 FROM score a, score b, student s WHERE a.s_id = b.s_id AND a.c_id ='01' AND b.c_id ='02' AND a.s_score > b.s_score AND s.s_id = a.s_id ;
#使用临时表连接,这种方法虽然复杂,但是能减少连接表数据量,会快一些。 SELECT stu.*, tmp.score_01, tmp.score_02 FROM ( SELECT a.s_id, a.s_score AS score_01, b.s_score AS score_02 FROM score a, score b WHERE a.s_id = b.s_id AND a.c_id ='01' AND b.c_id ='02' AND a.s_score > b.s_score ) tmp LEFTJOIN student stu ON stu.s_id = tmp.s_id;
第二种方案:长表变宽表
计算出所有学生的每个课程的成绩,然后取出”01”课程比”02”课程成绩高
Step1.计算出所有学生的每个课程的成绩
1 2 3 4 5 6 7 8 9
SELECT s_id, max( CASEWHEN c_id ='01'THEN s_score END ) AS score_01, max( CASEWHEN c_id ='02'THEN s_score END ) AS score_02, max( CASEWHEN c_id ='03'THEN s_score END ) AS score_03 FROM score GROUPBY s_id
SELECT stu.*,sc.score_01,sc.score_02 FROM student stu INNERJOIN (SELECT sc.s_id, max( CASEWHEN sc.c_id ='01'THEN s_score END ) AS score_01, max( CASEWHEN sc.c_id ='02'THEN s_score END ) AS score_02, max( CASEWHEN sc.c_id ='03'THEN s_score END ) AS score_03 FROM score sc GROUPBY s_id) sc ON stu.s_id=sc.s_id AND sc.score_01>sc.score_02