我有成绩表,其中包含学生证,班级,科目,科目ID,总成绩和isPassed状态(1 =通过,0 =失败)。 我希望所有学科中具有isPass状态1的班级或部分的学生总数。 我的查询如下:
$pass = Marks::select('student_id')
->where('class_room_id', '=', 10)
->where('section_id', '=', 1)
->where('isPassed', '=', 1)
->distinct()
->get();
$passed = count($pass);
表格如下:
student_id subject_id isPassed
1001 100 1
1001 101 0
1001 102 1
1001 103 1
1001 104 1
1002 100 1
1002 101 1
1002 102 1
1002 103 1
1002 104 1
答案 0 :(得分:1)
您的SQL查询应如下所示:
SELECT COUNT(student_id)
FROM marks
WHERE class_room_id = 10
AND student_id NOT IN (SELECT student_id FROM marks WHERE class_room_id = 10 AND isPassed = 0)
嵌套查询SELECT student_id FROM marks WHERE class_room_id = 10 AND isPassed = 0
选择给定班级中的所有至少接受过isPassed = 0
测试的学生。这些是您不需要的学生。
更新
好吧,在获得注释中提供的所有信息之后,这里就是答案。
您要查找的查询是:
SELECT COUNT(DISTINCT student_id)
FROM tbl2
WHERE student_id NOT IN (SELECT student_id FROM tbl2 WHERE isPassed = 0)
它获得通过所有学科的学生人数。
嵌套查询为:
SELECT student_id FROM tbl2 WHERE isPassed = 0
它使至少一次失败的学生获得成功。
一个用于演示它的SQLFiddle:http://sqlfiddle.com/#!9/a6baf4/1
答案 1 :(得分:0)
您可以使用聚合函数来获取每个组的计数
Marks::where('section_id', '=', 1)
->where('isPassed', '=', 1)
->groupBy('class_room_id')
->selectRaw('COUNT(1) as studentCount')
->get();
此查询将按class_room_id
返回一行,值为studentCount
。如果只需要一个或几个教室,则可以在查询中添加where过滤器。