2013-12-18 52 views
0

我有两个表marksexamsmysql增量变量使用案例

marks表我有studentidmark1mark2exams针对不同的考试examid - 对外商关键。

我想在一次查询中获得不同的学生ID和失败次数。

失败的条件是mark1+mark2 <50 or mark1<30。对于例如如果一个学生有1个学生,在马克表中有15个参赛作品(15个考试),同一个学生在6个参赛作品中失败,所以我想在两列中得到'1'和'6'的结果,对于所有学生也是如此。对于这种情况,我写了查询中使用“案例”及以下

select 
    distinct t1.studentid, 
    (@arrear:= 
     case 
      when (t1.mark1+t1.mark2) <50 OR t1.mark1 < 30 
      then @arrear+1 else @arrear 
     end) as failures 
from marks t1, exams t2, 
(select @arrear := 0) r 
where t1.examid = t2.examid group by t1.studentid; 

给定,但是上面的查询未能给出正确的结果。我如何修改查询以获得正确的结果?

回答

2

试试这个。你不需要使用变量来帮助你。

select 
    m.studentid, 
    sum(case when m.mark1 + m.mark2 < 50 or m.mark1 < 30 then 1 else 0 end) as failures 
from 
    marks m inner join exams e 
on 
    m.examid = e.examid 
group by 
    m.studentid 

case语句的工作了,如果结果是失败与否和失败,返回0到1的没有失败。总结这(通过studentidgroup)的结果为您提供了数每studentid

哦失败,并且加入使你的两个表:)

+1

,因为你在'studentid'分组不需要'DISTINCT'这里。每个学生已经只有一行。 –

+0

谢谢你的反应的CResults。你的查询给出了正确的结果。 –

+0

非常好的一点@MarcusAdams。已删除独特! – CResults

1

你不需要变量@arrear之间更有效的加入。你可以只使用查询

试试这个让你的信息:

select 
    distinct t1.studentid, 
    sum(
     case 
      when (t1.mark1+t1.mark2) <50 OR t1.mark1 < 30 
      then 1 
      else 0 
     end 
    ) as failures 
from marks t1, exams t2 
where t1.examid = t2.examid group by t1.studentid; 
+0

谢谢Joe Taras的回复。你的查询给出了正确的结果。 –