我正在尝试开发一个简单的php出勤系统,但我遇到了麻烦。我想以这种形式从出勤表中生成出勤报告:

sid | present(%) | late(%) | permission(%) | absent (%) |
    |            |         |               |            |


我遇到的问题是我无法计算出勤表中所有学生的百分比。我的出勤表的结构是:

sid| course | smister| section | attendance_status | date |
   |        |        |         |                   |      |


代码可能像这样:

$query=slect * from attendance where course=course And semister = semister and section = section;
     $result=mysqli_query(..,..);
while($row=$result_>fetch_assoc()){

//here calculate all selected students ateendance status in the above form

}


php - 我如何使用php从mysql计算出勤率-LMLPHP

最佳答案

如果要在PHP中执行此操作,则似乎需要“计数”“当前”,“迟到”,“许可”和“缺席”记录的出现次数,以及记录总数。以及每个sid的值(我们假定是学生ID)。

sid对行进行排序,并使用常规的控制中断处理。当我们得到与上一行不同的sid行时,我们就完成了上一个sid,因此发出所有计数器,并执行任何计算。

然后重置计数器,为积累此新学生做好准备。

我建议将其作为一个更简单的问题进行处理,例如,仅计算每个sid的行数。一旦可行,可以扩展相同的模式以保留多个计数器,并根据行中的信息有条件地增加计数器。 (例如,仅对表示缺席的行增加“缺席”计数器。



另一种选择是使用条件聚合完全避免PHP中的繁琐操作,而仅让SQL返回结果。

最简单的形式,获取每个sid的行数

SELECT a.sid
     , COUNT(*) AS tot
  FROM attendance a
 GROUP BY a.sid
 ORDER BY a.sid


添加适当的WHERE子句(在GROUP BY子句之前)以限制我们要查看的行。

我们可以根据条件扩展相同的模式,以获得其他计数。我们只是在猜测attendance表中有哪些列,以及我们如何确定该行是否指示缺席...

SELECT a.sid
     , SUM(1)   AS tot
     , SUM(a.attendance_code = 'Absent') AS cnt_absent
     , SUM(a.attendance_code = 'Tardy' ) AS cnt_late

     , 100.0
     * SUM(a.attendance_code = 'Absent')
     / SUM(1)                            AS pct_absent

     , 100.0
     * SUM(a.attendance_code = 'Tardy' )
     / SUM(1)                            AS pct_late

  FROM attendance a
 GROUP BY a.sid
 ORDER BY a.sid

关于php - 我如何使用php从mysql计算出勤率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49988836/

10-11 03:26