如何获得一列的不同计数,以及同一表中另一列的不同值?

rn0zuynd  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(301)

我有一个分数表,包括学生id、班级、部门、科目id、总分和iPassed状态(1=通过,0=失败)。我想在一个班级或部门的学生总数已通过的所有科目的状态1。我的查询如下所示:

$pass = Marks::select('student_id')
                    ->where('class_room_id', '=', 10)
                    ->where('section_id', '=', 1)
                    ->where('isPassed', '=', 1)
                    ->distinct()
                    ->get();
 $passed = count($pass);

这张table看起来像:

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
fcy6dtqo

fcy6dtqo1#

您可以使用聚合函数来获取每个组的计数

Marks::where('section_id', '=', 1)
    ->where('isPassed', '=', 1)
    ->groupBy('class_room_id')
    ->selectRaw('COUNT(1) as studentCount')
    ->get();

此查询将按返回一行 class_room_id 有价值的 studentCount . 如果只需要一个或几个教室,可以向查询中添加where筛选器。

pcrecxhr

pcrecxhr2#

您的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

它让那些至少失败过一次的学生。
一把小提琴来演示:http://sqlfiddle.com/#!9/a6baf4/1号

相关问题