我有两张表marks
和exams
。
在marks
表中,我有studentid
,mark1
,mark2
和examid
- 来自exams
的外键,用于不同的考试。< / p>
我想在一个查询中获得不同的学生ID和失败次数。
失败的条件是mark1+mark2 <50 or mark1<30
。对于例如如果有学生1的学生在标记表中有15个条目(15个考试),并且同一个学生在6个中失败,那么我想在两列中得到“1”和“6”的结果,对所有学生来说也是如此。对于这种情况,我使用'case'编写了查询,并在下面给出
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;
但是上面的查询未能给出正确的结果。如何修改查询以获得正确的结果?
答案 0 :(得分: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
语句就会成功,失败则返回1,失败则返回0。总结此结果(group
编辑studentid
)可获得每个学生的失败数
哦,连接会在两个表之间建立更有效的连接:)
答案 1 :(得分: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;