MySql查询选择最高学生分数,包括必须科目分数

时间:2014-10-23 13:33:37

标签: mysql sql

我想在此处存档的原因是,只选择学生表现最佳的科目,包括必修科目(mustSubjectId),并根据成绩范围总计输出结果。
grade越高,点add sum(marks)越低。

输入参数示例:

$subjectlimit = '3'; // total subjects a student should pass including mandatory subject to qualify 
$idexam = '1'; // targeted examination id 
$mustSubjectId = '201'; // mandatory subjectid
$studentId = '1'; // a student to get

表格考试

idcandidate | subject_id   | score
------------------------------------
1           |    200       | 30 
1           |    201       | 60 (note: a must subject)
1           |    202       | 80 
1           |    204       | 90 
1           |    203       | 50 
1           |    205       | 54 
1           |    209       | 37 
8           |    200       | 68 
2           |    200       | 20 
1           |    206       | 50 

表格考试

idexam          | marks       | grade
---------------------------------------
1               |    30       | 9 
1               |    45       | 8 
1               |    65       | 7 
1               |    70       | 6
1               |    80       | 5 
1               |    85       | 4 
1               |    90       | 3 
1               |    95       | 2 
1               |    100      | 1 

限制3的输出

Idcandidate| idexam   | subject_id| grade
1          |     1    | 204       |    3
1          |     1    | 202       |    5
1          |     1    | 201       |    8

最终输出

Idcandidate| idexam  | points
1          |     1   |    16

我希望您可以提供帮助,因为我对复杂的MySql查询不了解

修改

  

我在评论中被JNevill弄错了,表格检查确实如此   没有idexam,也没有与examrules的关系。选择   应该像

     

选择最高分,包括考试的必修科目分数   其中idcandidate ='1'限制3然后检查所选的分数等级   在例如idexam ='1'的考试中,将找到等级   应计算为点数(等级)为点

查询的目标

  

有一张表显示班级所有科目的成绩   学生,然后在某一行,表格假设显示点   学生上3门科目,包括必修科目。为一个   学生通过考试他/她应该通过三个科目   包括强制性主题。

注意 正在运行的sql是报告不识别选择顶部而我也尝试小提琴,小提琴也不认识它。 select top 3 score from examinations where idcandidate = ‘1’

1 个答案:

答案 0 :(得分:0)

我建议像(适当地用参数替换值):

这为您提供了不是“必须受试者”的前2个最高分:

select TOP 2 en.idcandidate, en.idexam, en.subject_id, en.grade
FROM examinations en
INNER JOIN examrules er ON en.idexam = er.idexam
where en.subject <> $mustSubjectId
order by en.score desc

这会为您提供“必须的主题”:

select en.idcandidate, en.idexam, en.subject_id, en.grade
FROM examinations en
INNER JOIN examrules er ON en.idexam = er.idexam
where en.subject = $mustSubjectId

这会为您提供'输出限制3'(只需将其附加到另一个):

select TOP 2 en.idcandidate, en.idexam, en.subject_id, en.grade
FROM examinations en
INNER JOIN examrules er ON en.idexam = er.idexam
where en.subject <> $mustSubjectId
order by en.score desc
UNION ALL
select en.idcandidate, en.idexam, en.subject_id, en.grade
FROM examinations en
INNER JOIN examrules er ON en.idexam = er.idexam
where en.subject = $mustSubjectId

最后你将成绩加起来:

select idcandidate, idexam, sum(en.grade) as points FROM
(
    select TOP 2 en.idcandidate, en.idexam, en.subject_id, en.grade
    FROM examinations en
    INNER JOIN examrules er ON en.idexam = er.idexam
    where en.subject <> $mustSubjectId
    order by en.score desc
    UNION ALL
    select en.idcandidate, en.idexam, en.subject_id, en.grade
    FROM examinations en
    INNER JOIN examrules er ON en.idexam = er.idexam
    where en.subject = $mustSubjectId
) a group by a.idcandidate, a.idexam

我没有机会测试这个,但希望有所帮助!