如何获得与同一表中另一列的不同值相对应的一列的不同计数?

时间:2018-08-23 08:32:59

标签: mysql laravel

我有成绩表,其中包含学生证,班级,科目,科目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

2 个答案:

答案 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过滤器。